{
 "firmware": "OberVave",
 "slug": "obervave",
 "author": "zvenson",
 "repo": "https://github.com/zvenson/obervave",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "v1.4.2",
 "mapped_commit": "e68d0397c6002a64c7365d24241119401f41119e",
 "release_date": "2026-10-16",
 "date_mapped": "2026-10-16",
 "version_note": "The README identifies v1.4.2 as running on the FM-1 without a beta qualifier; the hub beta label concerns the SMK-37 build.",
 "turns_it_into": "An eight-voice synth inspired by early Oberheim instruments, with two oscillators per voice, two sequencer tracks, separate sounds for A and B, and chorus, delay and reverb.",
 "docs": [
  {
   "title": "OberVave README",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md",
   "words": 2417,
   "read_at": "2026-10-16",
   "word_count_method": "Whitespace-separated Markdown tokens."
  }
 ],
 "install": {
  "official": "https://github.com/zvenson/obervave/tree/v1.4.2",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "SEL is button_sel, although this firmware calls it SELECT in its hints; encoder_select is the separate tempo encoder and has no push action. The 27 keys run from F3 to G5 at octave 0. Button lights use lights.button_*; key lights use lights.key_lights and groups.key_lights. Layer modes override the page beneath them; locked layers have the same key and knob jobs as held layers. Normal page knob entries assume no layer. Sequencer step-key entries assume recording is off; armed or active recording makes SEQ-layer keys play notes instead. Note recording and cursor entry require an enabled track and assume no EDIT, GLO or SAVE key layer. Steps beyond the track length cannot be selected. All facts were read in source; no unit was tested. jack_usb is retained as an alias for the shared-list jack_usb_c so existing USB entries and check references keep their stable addresses; both names denote the same USB-C connection, following the checked maps’ panel reconciliation.",
 "modes": [
  {
   "id": "perform",
   "name": "PERFORM",
   "how_to_get_there": "Press HOME.",
   "what_it_is": "The four knob positions are CUTOFF, RESONANCE, FILTER ENV, AMP RELEASE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "131",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "osc1",
   "name": "OSC 1",
   "how_to_get_there": "With no locked layer, press HOME, then tap EDIT.",
   "what_it_is": "The four knob positions are OSC 1 WAVE, OSC 1 PW, OSC 1 LEVEL, NOISE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "132",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1487-1488",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1487-L1488"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "940-948",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L940-L948"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1542",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
    }
   ]
  },
  {
   "id": "osc2",
   "name": "OSC 2",
   "how_to_get_there": "Tap EDIT again after OSC 1.",
   "what_it_is": "The four knob positions are OSC 2 WAVE, OSC 2 PW, OSC 2 LEVEL, OSC 2 SEMI.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "133",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "oscmod",
   "name": "OSC MOD",
   "how_to_get_there": "Tap EDIT again after OSC 2.",
   "what_it_is": "The four knob positions are SYNC, X-MOD, ENV TO OSC 2, OSC 2 FINE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "134",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "filter",
   "name": "FILTER",
   "how_to_get_there": "Tap EDIT again after OSC MOD.",
   "what_it_is": "The four knob positions are RESONANCE, FILTER ENV, KEY TRACK, FILTER TYPE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "135",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "filter2",
   "name": "FILTER +",
   "how_to_get_there": "Tap EDIT again after FILTER.",
   "what_it_is": "The four knob positions are DRIVE, VEL FILTER, VEL AMP, MORPH.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "136",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "fenv",
   "name": "FILTER ENV",
   "how_to_get_there": "Press ENV from outside the envelope pages.",
   "what_it_is": "The four knob positions are FLT ATTACK, FLT DECAY, FLT SUSTAIN, FLT RELEASE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "137",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "aenv",
   "name": "AMP ENV",
   "how_to_get_there": "Press ENV again after FILTER ENV.",
   "what_it_is": "The four knob positions are AMP ATTACK, AMP DECAY, AMP SUSTAIN, AMP RELEASE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "138",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "lfo",
   "name": "LFO",
   "how_to_get_there": "Press LFO from outside its three pages.",
   "what_it_is": "The four knob positions are LFO SHAPE, LFO RATE, LFO DELAY, LFO PHASE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "139",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "lfodest",
   "name": "LFO DEST",
   "how_to_get_there": "Press LFO again after LFO.",
   "what_it_is": "The four knob positions are LFO PITCH, LFO PWM, LFO FILTER, LFO AMP.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "140",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "lfo2",
   "name": "LFO +",
   "how_to_get_there": "Press LFO again after LFO DEST.",
   "what_it_is": "The four knob positions are PITCH TARGET, PWM TARGET, -, -.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "141",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "arp",
   "name": "ARP",
   "how_to_get_there": "Press ARP from another page.",
   "what_it_is": "The four knob positions are ARP MODE, ARP DIV, ARP OCTAVES, ARP GATE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "144",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "chorus",
   "name": "CHORUS",
   "how_to_get_there": "Tap FX from outside the effects pages.",
   "what_it_is": "The four knob positions are CHORUS RATE, CHORUS DEPTH, CHORUS MIX, -.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "145",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "delay",
   "name": "DELAY",
   "how_to_get_there": "Tap FX again after CHORUS.",
   "what_it_is": "The four knob positions are DELAY TIME, DELAY FB, DELAY TONE, DELAY MIX.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "146",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "reverb",
   "name": "REVERB",
   "how_to_get_there": "Tap FX again after DELAY.",
   "what_it_is": "The four knob positions are REVERB SIZE, REVERB DAMP, PRE-DELAY, REVERB MIX.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "147",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "voice",
   "name": "VOICE",
   "how_to_get_there": "Tap GLO again after GLOBAL.",
   "what_it_is": "The four knob positions are VOICE MODE, UNI VOICES, UNI DETUNE, GLIDE.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "142",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "output",
   "name": "OUTPUT",
   "how_to_get_there": "Tap GLO again after VOICE.",
   "what_it_is": "The four knob positions are VINTAGE, SPREAD, BEND RANGE, SOUND LEVEL.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_params.h",
     "lines": "143",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1553",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1553"
    }
   ]
  },
  {
   "id": "global",
   "name": "GLOBAL",
   "how_to_get_there": "Tap GLO from outside GLOBAL, VOICE and OUTPUT, or after OUTPUT.",
   "what_it_is": "Tempo, click, MIDI channel and tuning, with audio processing time below.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1490",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1490"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "531-538",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L531-L538"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "568-570",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L568-L570"
    }
   ]
  },
  {
   "id": "seq_tracks",
   "name": "TRACKS",
   "how_to_get_there": "Tap SEQ from a sound page.",
   "what_it_is": "Two rows show the programs, lengths, mute states and step playheads for A and B.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "64-73",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L64-L73"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1479-1486",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1479-L1486"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1167-1205",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1167-L1205"
    }
   ]
  },
  {
   "id": "seq_steps",
   "name": "STEPS",
   "how_to_get_there": "Tap SEQ again after TRACKS.",
   "what_it_is": "The piano roll, cursor chord, step overview and STEP, NOTE, GATE and VELO knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "64-73",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L64-L73"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1479-1486",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1479-L1486"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1099-1165",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
    }
   ]
  },
  {
   "id": "seq_more",
   "name": "STEP+",
   "how_to_get_there": "Tap SEQ again after STEPS.",
   "what_it_is": "The piano roll with STEP, RATCHET, CHANCE and ON/OFF knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "64-73",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L64-L73"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1479-1486",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1479-L1486"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1099-1165",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
    }
   ]
  },
  {
   "id": "seq_track",
   "name": "TRACK",
   "how_to_get_there": "Tap SEQ again after STEP+.",
   "what_it_is": "The piano roll with LENGTH, DIV, SWING and TRANSP knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "64-73",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L64-L73"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1479-1486",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1479-L1486"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1099-1165",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
    }
   ]
  },
  {
   "id": "seq_slots",
   "name": "PATTERNS",
   "how_to_get_there": "Tap SEQ again after TRACK.",
   "what_it_is": "Eight pattern slots, their saved track lengths, the current slot and queued destination.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "64-73",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L64-L73"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1479-1486",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1479-L1486"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1207-1230",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1207-L1230"
    }
   ]
  },
  {
   "id": "layer_seq",
   "name": "SEQ layer",
   "how_to_get_there": "Hold SEQ, or press HOME during the hold to keep the layer open.",
   "what_it_is": "White keys address the sixteen steps on the selected page and the first eight black keys choose pages while recording is off; knobs edit the track or held step.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "634-659",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
    }
   ]
  },
  {
   "id": "layer_edit",
   "name": "EDIT layer",
   "how_to_get_there": "Hold EDIT, or press HOME during the hold to keep the layer open.",
   "what_it_is": "Keys erase their pitch from the selected track; knobs shift, resize and transpose it.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "661-690",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
    }
   ]
  },
  {
   "id": "layer_glo",
   "name": "GLO layer",
   "how_to_get_there": "Hold GLO, or press HOME during the hold to keep the layer open.",
   "what_it_is": "Keys mute or solo tracks and G5 sets tap tempo; the four knobs have no action.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "791-814",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
    }
   ]
  },
  {
   "id": "layer_save",
   "name": "SAVE layer",
   "how_to_get_there": "Hold SAVE, or press HOME during the hold to keep the layer open.",
   "what_it_is": "Keys choose or copy patterns and SEL randomizes the selected sound; the four knobs have no action.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1283-1289",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
    }
   ]
  },
  {
   "id": "layer_fx",
   "name": "FX layer",
   "how_to_get_there": "Hold FX, or press HOME during the hold to keep the layer open.",
   "what_it_is": "Keys still play notes; the four knobs control the shared effects mixes and delay time.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1649-1655",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1655"
    }
   ]
  },
  {
   "id": "step_held",
   "name": "Held sequencer step",
   "how_to_get_there": "With recording off, hold a white key in the SEQ layer.",
   "what_it_is": "The four knobs edit the held step instead of the track.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "699-780",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L780"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "640-649",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
    }
   ]
  },
  {
   "id": "layer_locked",
   "name": "Locked layer",
   "how_to_get_there": "Press HOME while holding SEQ, EDIT, GLO, SAVE or FX.",
   "what_it_is": "The locked layer retains its own keys and knobs until a page or layer button dismisses it.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1462-1478",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1539-1547",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
    }
   ]
  },
  {
   "id": "save_armed",
   "name": "Program save armed",
   "how_to_get_there": "Outside the full-screen sequencer, tap SAVE once.",
   "what_it_is": "A second SAVE tap within three seconds stores the selected sound in its program.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1494-1505",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1494-L1505"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1592",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1592"
    }
   ]
  },
  {
   "id": "rec_ready",
   "name": "Recording armed",
   "how_to_get_there": "Release REC in under 700 ms while stopped.",
   "what_it_is": "With the selected track enabled, the first note starts recording from step one, or PLAY starts it with the optional count-in.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "231-254",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1554-1579",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1554-L1579"
    }
   ]
  },
  {
   "id": "recording",
   "name": "Live recording",
   "how_to_get_there": "Release REC in under 700 ms while playing, or start from armed recording.",
   "what_it_is": "Notes overdub the selected enabled track and note releases determine gates and ties.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "231-281",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L281"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1574-1580",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1574-L1580"
    }
   ]
  },
  {
   "id": "rec_clear",
   "name": "Track-clear hold",
   "how_to_get_there": "Keep REC held for longer than 700 ms.",
   "what_it_is": "A progress hint appears until the track clears after more than two seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "604-612",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L604-L612"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obervave.c",
     "lines": "1562-1580",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1562-L1580"
    }
   ]
  },
  {
   "id": "rescue",
   "name": "USB rescue",
   "how_to_get_there": "Power on with OCT- alone held, leaving OCT+ released.",
   "what_it_is": "Audio and normal instrument controls are stopped while USB firmware installation remains available.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/recovery.c",
     "lines": "41-69",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/recovery.c#L41-L69"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/bootguard.h",
     "lines": "31-33",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/bootguard.h#L31-L33"
    }
   ]
  },
  {
   "id": "startup",
   "name": "Startup",
   "how_to_get_there": "Power on normally.",
   "what_it_is": "The splash precedes the instrument.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/obv_ui.h",
     "lines": "479-518",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_ui.h#L479-L518"
    },
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/platform.c",
     "lines": "415-449",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L415-L449"
    }
   ]
  },
  {
   "id": "update",
   "name": "USB update",
   "how_to_get_there": "Start a firmware install over USB.",
   "what_it_is": "Update stages replace the instrument screen outside rescue.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/platform.c",
     "lines": "175-195",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L175-L195"
    }
   ]
  },
  {
   "id": "uboot",
   "name": "USB bootloader",
   "how_to_get_there": "Request UBOOT from the connected installer.",
   "what_it_is": "The instrument stops and enters the chip USB bootloader.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/platform.c",
     "lines": "377-385",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L377-L385"
    }
   ]
  },
  {
   "id": "fault",
   "name": "Fault display",
   "how_to_get_there": "Appears if the running firmware encounters a trapped fault.",
   "what_it_is": "A red fault display precedes an automatic restart.",
   "source": [
    {
     "kind": "source",
     "repo": "zvenson/obervave",
     "ref": "v1.4.2",
     "commit": "e68d0397c6002a64c7365d24241119401f41119e",
     "path": "firmware/src/platform.c",
     "lines": "396-412",
     "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L396-L412"
    }
   ]
  }
 ],
 "controls": {
  "screen": [
   {
    "mode": "perform",
    "gesture": "shows",
    "short_label": "PERFORM",
    "action": "Shows PERFORM with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "131",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "osc1",
    "gesture": "shows",
    "short_label": "OSC 1",
    "action": "Shows OSC 1 with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "132",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "osc2",
    "gesture": "shows",
    "short_label": "OSC 2",
    "action": "Shows OSC 2 with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "133",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "oscmod",
    "gesture": "shows",
    "short_label": "OSC MOD",
    "action": "Shows OSC MOD with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "134",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "filter",
    "gesture": "shows",
    "short_label": "FILTER",
    "action": "Shows FILTER with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "filter2",
    "gesture": "shows",
    "short_label": "FILTER +",
    "action": "Shows FILTER + with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "136",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "fenv",
    "gesture": "shows",
    "short_label": "FILTER ENV",
    "action": "Shows FILTER ENV with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "aenv",
    "gesture": "shows",
    "short_label": "AMP ENV",
    "action": "Shows AMP ENV with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "138",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "shows",
    "short_label": "LFO",
    "action": "Shows LFO with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "139",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "lfodest",
    "gesture": "shows",
    "short_label": "LFO DEST",
    "action": "Shows LFO DEST with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "140",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "lfo2",
    "gesture": "shows",
    "short_label": "LFO +",
    "action": "Shows LFO + with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "141",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "shows",
    "short_label": "ARP",
    "action": "Shows ARP with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "144",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "shows",
    "short_label": "CHORUS",
    "action": "Shows CHORUS with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "145",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "shows",
    "short_label": "DELAY",
    "action": "Shows DELAY with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "146",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "shows",
    "short_label": "REVERB",
    "action": "Shows REVERB with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "147",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "shows",
    "short_label": "VOICE",
    "action": "Shows VOICE with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "142",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "output",
    "gesture": "shows",
    "short_label": "OUTPUT",
    "action": "Shows OUTPUT with its knob values, program name and edit mark above, plus a waveform and eight voice-level circles unless sequencer or recording information replaces them.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "143",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "421-455",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L421-L455"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1796-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1796-L1814"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "shows",
    "short_label": "GLOBAL",
    "action": "Shows tempo, click, MIDI channel and tuning, with audio processing time in microseconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "531-538",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L531-L538"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "568-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L568-L570"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "shows",
    "short_label": "TRACKS",
    "action": "Shows two rows with the programs, lengths, mute states and step playheads for A and B.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1167-1205",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1167-L1205"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1078-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1078-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1167-1192",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1167-L1192"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "shows",
    "short_label": "STEPS",
    "action": "Shows the piano roll, cursor chord, step overview and STEP, NOTE, GATE and VELO knobs.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1099-1165",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1078-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1078-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "shows",
    "short_label": "STEP+",
    "action": "Shows the piano roll with STEP, RATCHET, CHANCE and ON/OFF knobs.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1099-1165",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1078-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1078-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "shows",
    "short_label": "TRACK",
    "action": "Shows the piano roll with LENGTH, DIV, SWING and TRANSP knobs.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1099-1165",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1099-L1165"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1078-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1078-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "shows",
    "short_label": "PATTERNS",
    "action": "Shows eight pattern slots, their saved track lengths, the current slot and queued destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1207-1230",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1207-L1230"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1078-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1078-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "shows",
    "short_label": "SEQ LAYER",
    "action": "Shows the SEQ layer controls over the current page, with a piano roll on a full-screen sequencer view or layer hints on a sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "504-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L504-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1088-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1088-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1776-1809",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1776-L1809"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "shows",
    "short_label": "EDIT LAYER",
    "action": "Shows the EDIT layer controls over the current page, with a piano roll on a full-screen sequencer view or layer hints on a sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "504-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L504-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1088-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1088-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1776-1809",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1776-L1809"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "shows",
    "short_label": "GLO LAYER",
    "action": "Shows the GLO layer controls over the current page, with a piano roll on a full-screen sequencer view or layer hints on a sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "504-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L504-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1088-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1088-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1776-1809",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1776-L1809"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "shows",
    "short_label": "SAVE LAYER",
    "action": "Shows the SAVE layer controls over the current page, with a piano roll on a full-screen sequencer view or layer hints on a sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "504-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L504-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1088-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1088-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1776-1809",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1776-L1809"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "shows",
    "short_label": "FX LAYER",
    "action": "Shows the FX layer controls over the current page, with a piano roll on a full-screen sequencer view or layer hints on a sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "504-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L504-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1088-1090",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1088-L1090"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1776-1809",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1776-L1809"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "shows",
    "short_label": "STEP EDIT",
    "action": "Shows the held step’s note or chord count, velocity category, ratchet count and gate, with its position in the step display.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "474-501",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L474-L501"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1233-1245",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1233-L1245"
     }
    ]
   },
   {
    "mode": "save_armed",
    "gesture": "shows",
    "short_label": "SAVE?",
    "action": "Shows SAVE? on a sound page while waiting up to three seconds for the second SAVE tap.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "568-570",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L568-L570"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1494-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1494-L1505"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1592",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1592"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "shows",
    "short_label": "REC READY",
    "action": "Shows that the first note can start the take, with sequencer status replacing the waveform.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "618-620",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L618-L620"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1122-1124",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1122-L1124"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1812-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1812-L1814"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "shows",
    "short_label": "TAKE",
    "action": "Shows the active track recording status or remaining count-in beats, with sequencer status replacing the waveform.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "618-620",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L618-L620"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1122-1124",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1122-L1124"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1812-1814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1812-L1814"
     }
    ]
   },
   {
    "mode": "rec_clear",
    "gesture": "shows",
    "short_label": "CLEAR HOLD",
    "action": "Shows a clear-track progress hint after 700 ms of holding REC.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "604-612",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L604-L612"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1121",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1121"
     }
    ]
   },
   {
    "mode": "rescue",
    "gesture": "shows",
    "short_label": "USB RESCUE",
    "action": "Shows USB rescue, the USB connection and installer prompts, and that audio is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/recovery.c",
      "lines": "60-67",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/recovery.c#L60-L67"
     }
    ]
   },
   {
    "mode": "startup",
    "gesture": "shows",
    "short_label": "SPLASH",
    "action": "Shows the OberVave startup artwork before the instrument page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_ui.h",
      "lines": "479-518",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_ui.h#L479-L518"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1436",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1436"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "short_label": "UPDATE",
    "action": "Shows UPDATE with PACKAGE, CHECK HEAD, LOADER, CONFIRM or RESTART as reached, or FAILED on an error, while rescue keeps its existing screen.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "175-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L175-L189"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/ota.c",
      "lines": "283-353",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/ota.c#L283-L353"
     }
    ]
   },
   {
    "mode": "uboot",
    "gesture": "shows",
    "short_label": "UBOOT",
    "action": "Briefly shows UBOOT (USB) after stopping audio before entering the USB bootloader.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "377-385",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L377-L385"
     }
    ]
   },
   {
    "mode": "fault",
    "gesture": "shows",
    "short_label": "FAULT",
    "action": "Shows a red crash screen with three diagnostic numbers and restarts after about eight seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "396-412",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L396-L412"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "shows",
    "short_label": "LOCKED",
    "action": "Briefly confirms the lock, then keeps the active layer’s controls and hints visible.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "617-626",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L617-L626"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1119-1129",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1119-L1129"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "perform",
    "gesture": "turn",
    "short_label": "CUTOFF",
    "action": "Adjusts the filter cutoff for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "131",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc1",
    "gesture": "turn",
    "short_label": "OSC 1 WAVE",
    "action": "Adjusts the oscillator 1 waveform for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "132",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc2",
    "gesture": "turn",
    "short_label": "OSC 2 WAVE",
    "action": "Adjusts the oscillator 2 waveform for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "133",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "oscmod",
    "gesture": "turn",
    "short_label": "SYNC",
    "action": "Adjusts the oscillator hard sync for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "134",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter",
    "gesture": "turn",
    "short_label": "RESONANCE",
    "action": "Adjusts the filter resonance for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter2",
    "gesture": "turn",
    "short_label": "DRIVE",
    "action": "Adjusts the filter drive for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "136",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "fenv",
    "gesture": "turn",
    "short_label": "FLT ATTACK",
    "action": "Adjusts the filter-envelope attack time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "aenv",
    "gesture": "turn",
    "short_label": "AMP ATTACK",
    "action": "Adjusts the amp-envelope attack time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "138",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "short_label": "LFO SHAPE",
    "action": "Adjusts the LFO shape for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "139",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfodest",
    "gesture": "turn",
    "short_label": "LFO PITCH",
    "action": "Adjusts the LFO pitch depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "140",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo2",
    "gesture": "turn",
    "short_label": "PITCH TARGET",
    "action": "Chooses which oscillator receives LFO pitch modulation for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "141",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1660-1662",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1660-L1662"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "short_label": "ARP MODE",
    "action": "Adjusts the arpeggiator mode among OFF, UP, DOWN, UP/DN, RANDOM and PLAYED for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "144",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "short_label": "CHORUS RATE",
    "action": "Adjusts the chorus rate for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "145",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "short_label": "DELAY TIME",
    "action": "Adjusts the delay time in tempo divisions for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "146",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "short_label": "REVERB SIZE",
    "action": "Adjusts the reverb size for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "147",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "short_label": "VOICE MODE",
    "action": "Adjusts the voice mode among POLY, DUAL, UNISON and MONO for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "142",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "output",
    "gesture": "turn",
    "short_label": "VINTAGE",
    "action": "Adjusts the variation between voice cards for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "143",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "short_label": "TEMPO",
    "action": "Sets the internal tempo from 40 to 240 BPM and queues the settings for a silent write after more than two seconds, once stopped and quiet, without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1637-1642",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1637-L1642"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "turn",
    "short_label": "LENGTH",
    "action": "Sets the selected track length, starting an off track at up to sixteen steps clockwise if space permits and using jumps of sixteen on fast turns, with A and B sharing 256 steps and B at zero switched off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "turn",
    "short_label": "LENGTH",
    "action": "Sets the selected track length, starting an off track at up to sixteen steps clockwise if space permits and using jumps of sixteen on fast turns, with A and B sharing 256 steps and B at zero switched off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "short_label": "STEP CURSOR",
    "action": "Moves the step cursor and wraps around the track, or requests sixteen steps for an off track clockwise if the shared step space permits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn",
    "short_label": "STEP CURSOR",
    "action": "Moves the step cursor and wraps around the track, or requests sixteen steps for an off track clockwise if the shared step space permits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn",
    "short_label": "SLOT",
    "action": "Selects one of the eight pattern destinations.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "short_label": "LAST NOTE",
    "action": "Sets the note that an empty step receives and replaces the remembered chord with that single note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "LAST NOTE",
    "action": "Sets the note that an empty step receives and replaces the remembered chord with that single note, provided no white step key is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "short_label": "SHIFT",
    "action": "Rotates all selected-track steps one position later clockwise or earlier anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_edit",
    "short_label": "SHIFT",
    "action": "Rotates all selected-track steps one position later clockwise or earlier anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "short_label": "CHORUS MIX",
    "action": "Changes the shared chorus mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_fx",
    "short_label": "CHORUS MIX",
    "action": "Changes the shared chorus mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the GLO layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "-",
    "action": "Does nothing while GLO is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the SAVE layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing while SAVE is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "turn",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_fs3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_fs3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_gs3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_gs3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_as3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_as3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_cs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_cs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_ds4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_ds4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_fs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_fs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_gs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_gs4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_as4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_as4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_cs5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_cs5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_ds5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_ds5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_fs5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_fs5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "EXTEND NOTE",
    "action": "With step entry active, a clockwise turn ties the cursor chord into the next step and replaces that step with it without asking, stopping at the track end and leaving the edited pattern to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "991-1004",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L991-L1004"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "838-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L838-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "HELD NOTE",
    "action": "Moves the held step chord by a semitone, or places the remembered single note into an empty step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "perform",
    "gesture": "turn",
    "short_label": "RESONANCE",
    "action": "Adjusts the filter resonance for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "131",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc1",
    "gesture": "turn",
    "short_label": "OSC 1 PW",
    "action": "Adjusts the oscillator 1 pulse width for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "132",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc2",
    "gesture": "turn",
    "short_label": "OSC 2 PW",
    "action": "Adjusts the oscillator 2 pulse width for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "133",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "oscmod",
    "gesture": "turn",
    "short_label": "X-MOD",
    "action": "Adjusts the cross-modulation depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "134",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter",
    "gesture": "turn",
    "short_label": "FILTER ENV",
    "action": "Adjusts the filter-envelope depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter2",
    "gesture": "turn",
    "short_label": "VEL FILTER",
    "action": "Adjusts the velocity response of the filter for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "136",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "fenv",
    "gesture": "turn",
    "short_label": "FLT DECAY",
    "action": "Adjusts the filter-envelope decay time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "aenv",
    "gesture": "turn",
    "short_label": "AMP DECAY",
    "action": "Adjusts the amp-envelope decay time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "138",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "short_label": "LFO RATE",
    "action": "Adjusts the LFO rate for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "139",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfodest",
    "gesture": "turn",
    "short_label": "LFO PWM",
    "action": "Adjusts the LFO pulse-width depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "140",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo2",
    "gesture": "turn",
    "short_label": "PWM TARGET",
    "action": "Chooses which oscillator receives LFO pulse-width modulation for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "141",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1660-1662",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1660-L1662"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "short_label": "ARP DIV",
    "action": "Adjusts the arpeggiator note division for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "144",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "short_label": "CHORUS DEPTH",
    "action": "Adjusts the chorus depth for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "145",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "short_label": "DELAY FB",
    "action": "Adjusts the delay feedback for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "146",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "short_label": "REVERB DAMP",
    "action": "Adjusts the reverb damping for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "147",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "short_label": "UNI VOICES",
    "action": "Adjusts the unison voice count for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "142",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "output",
    "gesture": "turn",
    "short_label": "SPREAD",
    "action": "Adjusts the stereo voice spread for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "143",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "short_label": "CLICK",
    "action": "Chooses click OFF, REC, ON or COUNT-IN and queues the settings for a silent write after more than two seconds, once stopped and quiet, without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1637-1642",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1637-L1642"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "turn",
    "short_label": "SOUND LEVEL",
    "action": "Changes the volume of the selected track sound, using sound A when B shares it.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "turn",
    "short_label": "TRACK DIV",
    "action": "Sets the selected track note division.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "short_label": "STEP NOTE",
    "action": "Moves the cursor step chord by a semitone, or puts the last played notes into an empty step.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn",
    "short_label": "STEP RATCHET",
    "action": "Sets one to four hits on the cursor step, provided it contains notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in PATTERNS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "short_label": "TRACK DIV",
    "action": "Sets the selected track note division.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "TRACK DIV",
    "action": "Sets the selected track note division, provided no white step key is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "short_label": "RESIZE",
    "action": "Duplicates the selected track to twice its length clockwise if space allows or halves it anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_edit",
    "short_label": "RESIZE",
    "action": "Duplicates the selected track to twice its length clockwise if space allows or halves it anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "short_label": "DELAY MIX",
    "action": "Changes the shared delay mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_fx",
    "short_label": "DELAY MIX",
    "action": "Changes the shared delay mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the GLO layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "-",
    "action": "Does nothing while GLO is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the SAVE layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing while SAVE is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "turn",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "HELD LEVEL",
    "action": "Chooses GHOST, SOFT, NORM or HARD velocity for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "perform",
    "gesture": "turn",
    "short_label": "FILTER ENV",
    "action": "Adjusts the filter-envelope depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "131",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc1",
    "gesture": "turn",
    "short_label": "OSC 1 LEVEL",
    "action": "Adjusts the oscillator 1 level for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "132",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc2",
    "gesture": "turn",
    "short_label": "OSC 2 LEVEL",
    "action": "Adjusts the oscillator 2 level for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "133",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "oscmod",
    "gesture": "turn",
    "short_label": "ENV TO OSC 2",
    "action": "Adjusts the filter-envelope modulation of oscillator 2 pitch for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "134",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter",
    "gesture": "turn",
    "short_label": "KEY TRACK",
    "action": "Adjusts the filter keyboard tracking for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter2",
    "gesture": "turn",
    "short_label": "VEL AMP",
    "action": "Adjusts the velocity response of the amplifier for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "136",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "fenv",
    "gesture": "turn",
    "short_label": "FLT SUSTAIN",
    "action": "Adjusts the filter-envelope sustain level for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "aenv",
    "gesture": "turn",
    "short_label": "AMP SUSTAIN",
    "action": "Adjusts the amp-envelope sustain level for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "138",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "short_label": "LFO DELAY",
    "action": "Adjusts the LFO fade-in delay for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "139",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfodest",
    "gesture": "turn",
    "short_label": "LFO FILTER",
    "action": "Adjusts the LFO filter depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "140",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo2",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "141",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "short_label": "ARP OCTAVES",
    "action": "Adjusts the arpeggiator octave range for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "144",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "short_label": "CHORUS MIX",
    "action": "Adjusts the chorus mix for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "145",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "short_label": "DELAY TONE",
    "action": "Adjusts the delay feedback tone for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "146",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "short_label": "PRE-DELAY",
    "action": "Adjusts the reverb pre-delay for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "147",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "short_label": "UNI DETUNE",
    "action": "Adjusts the unison detuning for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "142",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "output",
    "gesture": "turn",
    "short_label": "BEND RANGE",
    "action": "Adjusts the pitch-bend range for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "143",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "short_label": "MIDI CHANNEL",
    "action": "Chooses OMNI or MIDI channel 1–16 and queues the settings for a silent write after more than two seconds, once stopped and quiet, without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1637-1642",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1637-L1642"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "turn",
    "short_label": "CUTOFF",
    "action": "Changes the cutoff of the selected track sound, using sound A when B shares it.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "turn",
    "short_label": "SWING",
    "action": "Sets the selected track swing from 50 to 75 percent.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "short_label": "STEP GATE",
    "action": "Changes the cursor step gate up to TIE, provided it contains notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn",
    "short_label": "STEP CHANCE",
    "action": "Changes the cursor step chance in five-percent increments, provided it contains notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn_cw",
    "short_label": "GO",
    "action": "Selects the selected pattern slot after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn_ccw",
    "short_label": "-",
    "action": "Does nothing on an anticlockwise turn in PATTERNS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "short_label": "SWING",
    "action": "Sets the selected track swing from 50 to 75 percent.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "SWING",
    "action": "Sets the selected track swing from 50 to 75 percent, provided no white step key is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "short_label": "REWRITE NOTE",
    "action": "Rewrites every selected-track note one semitone higher clockwise or lower anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_edit",
    "short_label": "REWRITE NOTE",
    "action": "Rewrites every selected-track note one semitone higher clockwise or lower anticlockwise, keeping one undo for the EDIT hold.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "short_label": "REVERB MIX",
    "action": "Changes the shared reverb mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_fx",
    "short_label": "REVERB MIX",
    "action": "Changes the shared reverb mix.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the GLO layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "-",
    "action": "Does nothing while GLO is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the SAVE layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing while SAVE is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "turn",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "HELD RATCHET",
    "action": "Sets one to four hits for the held step, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "perform",
    "gesture": "turn",
    "short_label": "AMP RELEASE",
    "action": "Adjusts the amp-envelope release time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "131",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L131"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc1",
    "gesture": "turn",
    "short_label": "NOISE",
    "action": "Adjusts the noise level for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "132",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L132"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "osc2",
    "gesture": "turn",
    "short_label": "OSC 2 SEMI",
    "action": "Adjusts the oscillator 2 pitch within two octaves either side for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "133",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L133"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "oscmod",
    "gesture": "turn",
    "short_label": "OSC 2 FINE",
    "action": "Adjusts the oscillator 2 fine tuning for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "134",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L134"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter",
    "gesture": "turn",
    "short_label": "FILTER TYPE",
    "action": "Adjusts the filter type among LP 12, HP 12, BP 12, NOTCH, LP 24 and SEM for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L135"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "filter2",
    "gesture": "turn",
    "short_label": "MORPH",
    "action": "Adjusts the SEM filter balance through low-pass, notch and high-pass for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "136",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L136"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "fenv",
    "gesture": "turn",
    "short_label": "FLT RELEASE",
    "action": "Adjusts the filter-envelope release time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L137"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "aenv",
    "gesture": "turn",
    "short_label": "AMP RELEASE",
    "action": "Adjusts the amp-envelope release time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "138",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L138"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "short_label": "LFO PHASE",
    "action": "Adjusts the LFO phase behaviour among SYNC, FREE and SPREAD for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "139",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L139"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfodest",
    "gesture": "turn",
    "short_label": "LFO AMP",
    "action": "Adjusts the LFO amplitude depth for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "140",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L140"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "lfo2",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "141",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L141"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "short_label": "ARP GATE",
    "action": "Adjusts the arpeggiator note length for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "144",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L144"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on this page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "145",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L145"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "delay",
    "gesture": "turn",
    "short_label": "DELAY MIX",
    "action": "Adjusts the delay mix for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "146",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L146"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "short_label": "REVERB MIX",
    "action": "Adjusts the reverb mix for sound A, whose effects both sounds share.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "147",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L147"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "short_label": "GLIDE",
    "action": "Adjusts the glide time for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "142",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L142"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "output",
    "gesture": "turn",
    "short_label": "SOUND LEVEL",
    "action": "Adjusts the selected sound volume for the sound selected by ALGORITHM and PRESETS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "143",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L143"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1665",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1665"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "short_label": "TUNE",
    "action": "Adjusts global tuning within 50 cents either side and queues the settings for a silent write after more than two seconds, once stopped and quiet, without a question or undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1637-1642",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1637-L1642"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "turn",
    "short_label": "FX SEND",
    "action": "Adjusts B’s effects send when B has its own program, otherwise shows a hint without changing a setting.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "turn",
    "short_label": "TRANSPOSE",
    "action": "Sets the selected track playback transpose within two octaves either side.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "963-988",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L963-L988"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "short_label": "STEP VELO",
    "action": "Changes the cursor step velocity from 1 to 127, provided it contains notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn",
    "short_label": "STEP ON/OFF",
    "action": "Enables the cursor step clockwise or disables it anticlockwise while keeping its notes, provided it contains notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "973-1020",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L973-L1020"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn_cw",
    "short_label": "COPY",
    "action": "For a destination other than the current pattern slot, queues the selected destination to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn_ccw",
    "short_label": "-",
    "action": "Does nothing on an anticlockwise turn in PATTERNS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "957-961",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L961"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn",
    "short_label": "LAYER LENGTH",
    "action": "Sets the selected track length with single increments on slow turns and three times the detected movement on fast turns, with A and B sharing 256 steps and B at zero switched off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "653-658",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L653-L658"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1636",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1636"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_seq",
    "short_label": "LAYER LENGTH",
    "action": "Sets the selected track length with single increments on slow turns and three times the detected movement on fast turns, with A and B sharing 256 steps and B at zero switched off, provided no white step key is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "634-659",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L634-L659"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "653-658",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L653-L658"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1633-1636",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1633-L1636"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the EDIT layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_edit",
    "short_label": "-",
    "action": "Does nothing in the EDIT layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "661-690",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L661-L690"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn",
    "short_label": "DELAY TIME",
    "action": "Changes the shared delay time in tempo divisions.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_fx",
    "short_label": "DELAY TIME",
    "action": "Changes the shared delay time in tempo divisions.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1649-1653",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1649-L1653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the GLO layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_glo",
    "short_label": "-",
    "action": "Does nothing while GLO is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing in the SAVE layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing while SAVE is held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1654-1655",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1654-L1655"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "turn",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f3",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g3",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a3",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b3",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_a4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_b4",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_c5",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_d5",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_e5",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_f5",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:key_g5",
    "short_label": "HELD GATE",
    "action": "Changes the held step gate up to TIE, without making a new undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "SEQ LAYER",
    "action": "Temporarily gives the keys and knobs the SEQ layer jobs until released, unless HOME locks it open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1462-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1507-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1507-L1510"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SEQ VIEW",
    "action": "Opens TRACKS, then cycles STEPS, STEP+, TRACK and PATTERNS on successive taps on release of a tap shorter than 600 ms that used no layer function.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1505"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "END SEQ",
    "action": "Ends its unlocked layer after a used hold or a hold lasting at least 600 ms, without opening a page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1510"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "LOCK SEQ",
    "action": "Keeps the SEQ layer open after its button is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "LOCK EDIT",
    "action": "Keeps the EDIT layer open after its button is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "LOCK GLO",
    "action": "Keeps the GLO layer open after its button is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "LOCK SAVE",
    "action": "Keeps the SAVE layer open after its button is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_fx",
    "short_label": "LOCK FX",
    "action": "Keeps the FX layer open after its button is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "PERFORM",
    "action": "Opens PERFORM when no layer is held or locked.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "EDIT LAYER",
    "action": "Temporarily gives the keys and knobs the EDIT layer jobs until released, unless HOME locks it open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1462-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1507-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1507-L1510"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SOUND PAGES",
    "action": "Cycles OSC 1, OSC 2, OSC MOD, FILTER and FILTER + unless STEPS or STEP+ gives EDIT its rest-entry job on release of a tap shorter than 600 ms that used no layer function.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1505"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "END EDIT",
    "action": "Ends its unlocked layer after a used hold or a hold lasting at least 600 ms, without opening a page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1510"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "REST",
    "action": "Clears the cursor step and advances on an unused tap shorter than 600 ms, with no question, one pattern undo available and the changed pattern later saved automatically when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "940-948",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L940-L948"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1487-1488",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1487-L1488"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "REST",
    "action": "Clears the cursor step and advances on an unused tap shorter than 600 ms, with no question, one pattern undo available and the changed pattern later saved automatically when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "940-948",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L940-L948"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1487-1488",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1487-L1488"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "GLO LAYER",
    "action": "Temporarily gives the keys and knobs the GLO layer jobs until released, unless HOME locks it open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1462-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1507-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1507-L1510"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "GLOBAL PAGES",
    "action": "Opens GLOBAL, then cycles VOICE and OUTPUT on release of a tap shorter than 600 ms that used no layer function.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1505"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "END GLO",
    "action": "Ends its unlocked layer after a used hold or a hold lasting at least 600 ms, without opening a page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1510"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "SAVE LAYER",
    "action": "Temporarily gives the keys and knobs the SAVE layer jobs until released, unless HOME locks it open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1462-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1507-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1507-L1510"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "ARM SAVE",
    "action": "Outside the full-screen sequencer, arms a program save for three seconds without writing yet on release of a tap shorter than 600 ms that used no layer function.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1505"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "END SAVE",
    "action": "Ends its unlocked layer after a used hold or a hold lasting at least 600 ms, without opening a page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1510"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "seq_tracks",
    "gesture": "release",
    "short_label": "SAVE PATTERN",
    "action": "Queues both tracks and their pattern settings into the current pattern slot on an unused tap shorter than 600 ms, without asking, writing once stopped and quiet without creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1491-1493",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1491-L1493"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "928-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L928-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "SAVE PATTERN",
    "action": "Queues both tracks and their pattern settings into the current pattern slot on an unused tap shorter than 600 ms, without asking, writing once stopped and quiet without creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1491-1493",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1491-L1493"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "928-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L928-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "SAVE PATTERN",
    "action": "Queues both tracks and their pattern settings into the current pattern slot on an unused tap shorter than 600 ms, without asking, writing once stopped and quiet without creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1491-1493",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1491-L1493"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "928-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L928-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "release",
    "short_label": "SAVE PATTERN",
    "action": "Queues both tracks and their pattern settings into the current pattern slot on an unused tap shorter than 600 ms, without asking, writing once stopped and quiet without creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1491-1493",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1491-L1493"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "928-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L928-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "release",
    "short_label": "SAVE PATTERN",
    "action": "Queues both tracks and their pattern settings into the current pattern slot on an unused tap shorter than 600 ms, without asking, writing once stopped and quiet without creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1491-1493",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1491-L1493"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "928-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L928-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "save_armed",
    "gesture": "release",
    "short_label": "SAVE PROGRAM",
    "action": "On a second unused tap shorter than 600 ms within three seconds, stores the selected A or B sound in its current program and queues all saved programs and globals for a write after more than two seconds once stopped and quiet, without a further question or program undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1494-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1494-L1505"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1592",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1592"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "hold",
    "short_label": "FX LAYER",
    "action": "Temporarily gives the keys and knobs the FX layer jobs until released, unless HOME locks it open.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1462-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1462-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1507-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1507-L1510"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1542",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1542"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "FX PAGES",
    "action": "Cycles CHORUS, DELAY and REVERB on release of a tap shorter than 600 ms that used no layer function.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1505"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "END FX",
    "action": "Ends its unlocked layer after a used hold or a hold lasting at least 600 ms, without opening a page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1476-1510",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1476-L1510"
     }
    ]
   },
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "ENVELOPES",
    "action": "Cycles FILTER ENV and AMP ENV when no layer is locked.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1544-1548",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1544-L1548"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "LFO PAGES",
    "action": "Cycles LFO, LFO DEST and LFO + when no layer is locked.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1544-1549",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1544-L1549"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "layer_locked",
    "gesture": "press",
    "short_label": "UNLOCK",
    "action": "Dismisses the locked layer without opening that button’s page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1470-1478",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1470-L1478"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1539-1547",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1539-L1547"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "ARP PAGE",
    "action": "Opens ARP from another page when no layer is locked.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1544-1553",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1544-L1553"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "press",
    "short_label": "HOLD",
    "action": "Toggles the shared arpeggiator note latch without changing the arp mode, provided no layer is locked.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1550-1553",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1550-L1553"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing unless the SAVE layer is active.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1586-1591",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1586-L1591"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "RANDOM SOUND",
    "action": "Replaces the selected live sound with randomized parameters without asking or saving it, and pattern undo cannot restore the previous sound.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "318-364",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L318-L364"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1586-1591",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1586-L1591"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "RANDOM SOUND",
    "action": "Replaces the selected live sound with randomized parameters without asking or saving it, and pattern undo cannot restore the previous sound.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "318-364",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L318-L364"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1586-1591",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1586-L1591"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "START / STOP",
    "action": "Starts both sequencer tracks from step one or stops playback and active recording, allowing pending pattern and settings writes when quiet without asking or adding an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1554-1560",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1554-L1560"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1888"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "START TAKE",
    "action": "Begins recording from step one, with a one-bar count-in if CLICK is COUNT-IN.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1554-1559",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1554-L1559"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "124-150",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L124-L150"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "REC TIMER",
    "action": "Starts timing the REC hold without yet changing recording state.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1562",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1562"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RECORD",
    "action": "A release in under 700 ms arms recording when stopped, starts overdubbing when playing or ends an armed or active take, without writing flash at that moment.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1574-1584",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1574-L1584"
     }
    ]
   },
   {
    "mode": "rec_clear",
    "gesture": "release",
    "short_label": "CANCEL CLEAR",
    "action": "A release after 700 ms but before the clear threshold leaves recording and track contents unchanged.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1562-1584",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1562-L1584"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "CLEAR TRACK",
    "action": "After more than two seconds, clears every step of the selected track without asking, ends active recording, keeps one pattern undo and queues the edited pattern for automatic saving once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1562-1572",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1562-L1572"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "OCT -",
    "action": "Moves the keyboard down one octave within two octaves either side, except in the EDIT layer or the SEQ layer with recording off, and silently queues globals for a write after more than two seconds once stopped and quiet with no undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1518-1537",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1518-L1537"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP PAGE -",
    "action": "Moves the selected track step page down by sixteen steps while recording is off, retaining any selected held step so a later destination can extend and overwrite it across pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1530",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1530"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP PAGE -",
    "action": "Moves the selected track step page down by sixteen steps while recording is off, retaining any selected held step so a later destination can extend and overwrite it across pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1530",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1530"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "UNDO",
    "action": "Swaps the current pattern with a shared snapshot that survives pattern changes, so another pattern’s tracks and settings can replace the current slot without asking and save automatically once stopped and quiet, losing unsaved B sound edits if B’s program changes; repeating UNDO or REDO before another snapshot-taking edit restores the pattern contents but cannot recover those lost B sound edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "209",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L209"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1522",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1522"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "54-55",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L54-L55"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "191-201",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L201"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1521",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1521"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "UNDO",
    "action": "Swaps the current pattern with a shared snapshot that survives pattern changes, so another pattern’s tracks and settings can replace the current slot without asking and save automatically once stopped and quiet, losing unsaved B sound edits if B’s program changes; repeating UNDO or REDO before another snapshot-taking edit restores the pattern contents but cannot recover those lost B sound edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "209",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L209"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1522",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1522"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "54-55",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L54-L55"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "191-201",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L201"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1521",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1521"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_up",
    "short_label": "OCTAVE ZERO",
    "action": "Returns the keyboard octave to zero outside EDIT and the SEQ layer with recording off, silently queuing globals for a write after more than two seconds once stopped and quiet with no undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1518-1537",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1518-L1537"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "OCT +",
    "action": "Moves the keyboard up one octave within two octaves either side, except in the EDIT layer or the SEQ layer with recording off, and silently queues globals for a write after more than two seconds once stopped and quiet with no undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1518-1537",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1518-L1537"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP PAGE +",
    "action": "Moves the selected track step page up by sixteen steps while recording is off, retaining any selected held step so a later destination can extend and overwrite it across pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1530",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1530"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP PAGE +",
    "action": "Moves the selected track step page up by sixteen steps while recording is off, retaining any selected held step so a later destination can extend and overwrite it across pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1530",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1530"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "REDO",
    "action": "Swaps the current pattern with a shared snapshot that survives pattern changes, so another pattern’s tracks and settings can replace the current slot without asking and save automatically once stopped and quiet, losing unsaved B sound edits if B’s program changes; repeating UNDO or REDO before another snapshot-taking edit restores the pattern contents but cannot recover those lost B sound edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "209",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L209"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1522",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1522"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "54-55",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L54-L55"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "191-201",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L201"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1521",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1521"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "REDO",
    "action": "Swaps the current pattern with a shared snapshot that survives pattern changes, so another pattern’s tracks and settings can replace the current slot without asking and save automatically once stopped and quiet, losing unsaved B sound edits if B’s program changes; repeating UNDO or REDO before another snapshot-taking edit restores the pattern contents but cannot recover those lost B sound edits.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "209",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L209"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1522",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1522"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "54-55",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L54-L55"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "191-201",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L201"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1519-1521",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1521"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "switch_power": [
   {
    "mode": "any",
    "gesture": "power_on_holding:button_oct_down",
    "short_label": "USB RESCUE",
    "action": "Starts USB rescue with OCT- alone held and OCT+ released, leaving audio off and making no data save just for entering rescue.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/bootguard.h",
      "lines": "31-33",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/bootguard.h#L31-L33"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/recovery.c",
      "lines": "41-69",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/recovery.c#L41-L69"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "TEMPO",
    "action": "Sets internal tempo from 40 to 240 BPM even with a layer held, silently queuing globals for a write after more than two seconds once stopped and quiet with no undo.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1625-1632",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1625-L1632"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn_cw",
    "short_label": "TRACK B",
    "action": "Selects track B for editing and playing, using its own sound when assigned or sound A otherwise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1619-1623",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1619-L1623"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "turn_ccw",
    "short_label": "TRACK A",
    "action": "Selects track A for editing and playing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "150-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L150-L157"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1619-1623",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1619-L1623"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "PROGRAM",
    "action": "Outside sequencer views other than TRACKS, chooses A’s program with wraparound or B’s own program with a lower shared-A choice, replacing unsaved edits to that sound without asking or program undo and queuing A’s selection or B’s pattern change for the later silent save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1617",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1617"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "170-178",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L170-L178"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "turn",
    "short_label": "PATTERN",
    "action": "Selects the adjacent pattern slot after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1607",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1607"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "turn",
    "short_label": "PATTERN",
    "action": "Selects the adjacent pattern slot after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1607",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1607"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "seq_track",
    "gesture": "turn",
    "short_label": "PATTERN",
    "action": "Selects the adjacent pattern slot after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1607",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1607"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "seq_slots",
    "gesture": "turn",
    "short_label": "PATTERN",
    "action": "Selects the adjacent pattern slot after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1607",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1607"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "MASTER",
    "action": "Changes the output level of the whole instrument, including the USB recording feed, independently of program volume.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "337-357",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L337-L357"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "388-393",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L388-L393"
     }
    ]
   }
  ],
  "jack_usb": [
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "USB",
    "action": "Carries USB MIDI input and output, audio recording to the computer and firmware updates in the default FM-1 build.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "100-110",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L100-L110"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "277-292",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L277-L292"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "354-355",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L354-L355"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "370-375",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L370-L375"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "shows",
    "short_label": "MIDI CHORD",
    "action": "With recording off, the first incoming main-channel MIDI note replaces the held step’s notes without asking or taking an undo snapshot, further new pitches build a chord of up to four notes and set its velocity, and the changed pattern can save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ],
    "midi_message": "Main input channel Note On, velocity above zero, while a SEQ step is held and REC is off."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI INPUT",
    "action": "At OMNI, channel messages from every channel address the panel’s selected sound, while a fixed MIDI CH routes the chosen channel to that sound and reserves the following channel for B when available.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1330-1362",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1330-L1362"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "153-155",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L153-L155"
     }
    ],
    "midi_message": "GLOBAL MIDI CH: OMNI or fixed channel 1–16."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI NOTES",
    "action": "Plays the panel’s selected sound with incoming velocity and remembers the played notes for filling empty sequencer steps.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1363",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1363"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "783-788",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L783-L788"
     }
    ],
    "midi_message": "Main input channel Note On with velocity 1–127."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI RELEASE",
    "action": "Releases the incoming note in the sound where it began, subject to sustain or HOLD, and completes any matching cursor entry or recorded gate.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "183-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L183-L187"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1374-1377",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1374-L1377"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "381-389",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L381-L389"
     }
    ],
    "midi_message": "Main input channel Note Off, or Note On with velocity zero."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PITCH BEND",
    "action": "Bends both sounds according to each program’s BEND range of zero to twenty-four semitones.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1379",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1379"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "92",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L92"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "504-505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L504-L505"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "571-573",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L571-L573"
     }
    ],
    "midi_message": "Pitch Bend on the main input channel."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "SUSTAIN",
    "action": "CC 64 values 64–127 sustain released notes for both sounds, while 0–63 lift the pedal and release them unless HOLD still keeps them sounding.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1385",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1385"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "358-389",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L358-L389"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "392-403",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L392-L403"
     }
    ],
    "midi_message": "CC 64 on the main input channel: 0–63 pedal up, 64–127 pedal down."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI VOLUME",
    "action": "CC 7 changes the overall output level of both sounds independently of their program volume and does not save a program.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1388",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1388"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "491",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L491"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "652-658",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L652-L658"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "694-711",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L694-L711"
     }
    ],
    "midi_message": "CC 7 on the main input channel."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PANIC",
    "action": "Releases both sounds’ voices and clears their held arp notes without stopping the sequencer, which can play later steps again.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1385",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1385"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "406-425",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L406-L425"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "667-670",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L667-L670"
     }
    ],
    "midi_message": "CC 120 or CC 123 on the main input channel."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PROGRAM A",
    "action": "Reloads A’s program with values 0–127 wrapping through the thirty-two programs, discarding unsaved A edits without asking or undo, and changes its remembered selection without itself scheduling a settings write.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "140-148",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L140-L148"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "153-157",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L153-L157"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1380-1381",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1380-L1381"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1837",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1837"
     }
    ],
    "midi_message": "Program Change 0–127 on the main input channel while the panel uses sound A."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PROGRAM B",
    "action": "Selects B’s program with values 0–127 wrapping through thirty-two choices, replacing unsaved B edits only when the program changes without asking or program undo and scheduling the pattern’s new program reference for automatic saving once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "170-178",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L170-L178"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1380",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1380"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ],
    "midi_message": "Program Change 0–127 on the main input channel while the panel uses B’s own sound."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "B CHANNEL",
    "action": "Routes notes directly to B, falling back to sound A while B shares it, and applies mapped non-effects parameter CCs to B only when B has its own program.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "420-425",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L420-L425"
     }
    ],
    "midi_message": "With MIDI CH 1–15, send on the following channel."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "B PROGRAM",
    "action": "Assigns program one through thirty-two to B, replacing unsaved B edits only when its program changes without asking or program undo and scheduling the new pattern reference for automatic saving once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1352",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1352"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "170-178",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L170-L178"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ],
    "midi_message": "Program Change 0–31 on the following channel when MIDI CH is 1–15."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "B LIMITS",
    "action": "Ignores following-channel pitch bend, CC 7, sustain, panic, effects parameter CCs and program changes above 31, while OMNI or MIDI CH 16 provides no separate following-channel route.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1360",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1360"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "153-155",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L153-L155"
     }
    ],
    "midi_message": "Following-channel messages when MIDI CH is 1–15."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "B NOTE ENTRY",
    "action": "Plays B without direct cursor entry, held-step replacement or raw-note recording, although B’s arp output can still be recorded when B’s own sound is selected for recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1361-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1361-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     }
    ],
    "midi_message": "Notes on the following channel when MIDI CH is 1–15."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI CLOCK",
    "action": "Uses valid incoming clock timing for the arps, sequencer and delay without starting playback, then returns to internal tempo after more than two seconds without clock.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1331-1339",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1331-L1339"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1674",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1674"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "657",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L657"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "137",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L137"
     }
    ],
    "midi_message": "MIDI Clock, twenty-four pulses per quarter note."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI START",
    "action": "Starts the sequencer from the beginning and restarts both arp positions even for Continue, without changing whether recording is armed or active.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1341-1347",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1341-L1347"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "667",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L667"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "124-135",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L124-L135"
     }
    ],
    "midi_message": "MIDI Start or MIDI Continue, on any channel setting."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI STOP",
    "action": "Stops the sequencer without disabling the arps or changing recording state, allowing pending settings, SAVE and copy writes when their timing and quiet conditions permit, without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1347",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1347"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1857-1881",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1857-L1881"
     }
    ],
    "midi_message": "MIDI Stop, on any channel setting."
   },
   {
    "mode": "seq_steps",
    "gesture": "shows",
    "short_label": "MIDI WRITE",
    "action": "Replaces the cursor step’s chord on the first incoming note without asking, captures one pattern undo, builds up to four pitches with MIDI velocity and advances when all entry notes are released, leaving the result to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1361-1376",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1361-L1376"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ],
    "midi_message": "Main input channel notes with the selected track enabled, REC off, no layer and no held step."
   },
   {
    "mode": "seq_more",
    "gesture": "shows",
    "short_label": "MIDI WRITE",
    "action": "Replaces the cursor step’s chord on the first incoming note without asking, captures one pattern undo, builds up to four pitches with MIDI velocity and advances when all entry notes are released, leaving the result to save automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1361-1376",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1361-L1376"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ],
    "midi_message": "Main input channel notes with the selected track enabled, REC off, no layer and no held step."
   },
   {
    "mode": "rec_ready",
    "gesture": "shows",
    "short_label": "MIDI TAKE",
    "action": "With an enabled track outside count-in, starts an armed take from step one or overdubs the nearest running step using incoming velocity and release length for raw MIDI notes, recording the selected sound’s arp output at velocity 100 instead when enabled, with a take undo snapshot and later automatic saving once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-273",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L273"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1361-1376",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1361-L1376"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1557",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1557"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1577",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1577"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ],
    "midi_message": "Main input channel notes with an enabled selected track outside count-in."
   },
   {
    "mode": "recording",
    "gesture": "shows",
    "short_label": "MIDI TAKE",
    "action": "With an enabled track outside count-in, starts an armed take from step one or overdubs the nearest running step using incoming velocity and release length for raw MIDI notes, recording the selected sound’s arp output at velocity 100 instead when enabled, with a take undo snapshot and later automatic saving once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-273",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L273"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1361-1376",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1361-L1376"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1557",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1557"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1577",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1577"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ],
    "midi_message": "Main input channel notes with an enabled selected track outside count-in."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CC VALUES",
    "action": "Rescales each incoming parameter CC to that parameter’s available range, leaving sound edits temporary until the program is saved and routing effects edits to A’s shared effects.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1386-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1386-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "306-313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L306-L313"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "153-155",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L153-L155"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1494-1505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1494-L1505"
     }
    ],
    "midi_message": "Parameter CC values 0–127."
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 1 WAVE",
    "action": "CC 20 changes the selected sound’s oscillator 1 waveform using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "48",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L48"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 20 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 20,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 1 PW",
    "action": "CC 21 changes the selected sound’s oscillator 1 pulse width using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "49",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L49"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 21 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 21,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 1 LEVEL",
    "action": "CC 22 changes the selected sound’s oscillator 1 level using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "50",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L50"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 22 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 22,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "NOISE",
    "action": "CC 23 changes the selected sound’s noise level using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "51",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L51"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 23 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 23,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 2 WAVE",
    "action": "CC 24 changes the selected sound’s oscillator 2 waveform using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "52",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L52"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 24 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 24,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 2 PW",
    "action": "CC 25 changes the selected sound’s oscillator 2 pulse width using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "53",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L53"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 25 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 25,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 2 LEVEL",
    "action": "CC 26 changes the selected sound’s oscillator 2 level using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "54",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L54"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 26 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 26,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 2 SEMI",
    "action": "CC 27 changes the selected sound’s oscillator 2 semitone tuning using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "55",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L55"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 27 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 27,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "SYNC",
    "action": "CC 28 changes the selected sound’s hard sync using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "56",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L56"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 28 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 28,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "X-MOD",
    "action": "CC 29 changes the selected sound’s cross-modulation amount using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "57",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L57"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 29 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 29,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "ENV TO OSC 2",
    "action": "CC 30 changes the selected sound’s filter-envelope modulation of oscillator 2 pitch using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "58",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L58"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 30 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 30,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "OSC 2 FINE",
    "action": "CC 31 changes the selected sound’s oscillator 2 fine tuning using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "59",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L59"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 31 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 31,
    "midi_group": "Oscillators"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CUTOFF",
    "action": "CC 74 changes the selected sound’s filter cutoff using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "60",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L60"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 74 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 74,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "RESONANCE",
    "action": "CC 71 changes the selected sound’s filter resonance using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "61",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L61"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 71 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 71,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FILTER ENV",
    "action": "CC 32 changes the selected sound’s filter-envelope depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "62",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L62"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 32 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 32,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "KEY TRACK",
    "action": "CC 33 changes the selected sound’s filter key tracking using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "63",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L63"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 33 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 33,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FILTER TYPE",
    "action": "CC 34 changes the selected sound’s filter type using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "64",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L64"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 34 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 34,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "DRIVE",
    "action": "CC 35 changes the selected sound’s filter drive using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "65",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L65"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 35 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 35,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "VEL FILTER",
    "action": "CC 36 changes the selected sound’s filter velocity response using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "66",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L66"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 36 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 36,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "VEL AMP",
    "action": "CC 37 changes the selected sound’s amplifier velocity response using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "67",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L67"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 37 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 37,
    "midi_group": "Filter"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FLT ATTACK",
    "action": "CC 38 changes the selected sound’s filter-envelope attack using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "68",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L68"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 38 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 38,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FLT DECAY",
    "action": "CC 39 changes the selected sound’s filter-envelope decay using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "69",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L69"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 39 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 39,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FLT SUSTAIN",
    "action": "CC 40 changes the selected sound’s filter-envelope sustain using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "70",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L70"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 40 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 40,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "FLT RELEASE",
    "action": "CC 41 changes the selected sound’s filter-envelope release using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "71",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L71"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 41 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 41,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "AMP ATTACK",
    "action": "CC 73 changes the selected sound’s amp-envelope attack using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "72",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L72"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 73 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 73,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "AMP DECAY",
    "action": "CC 42 changes the selected sound’s amp-envelope decay using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "73",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L73"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 42 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 42,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "AMP SUSTAIN",
    "action": "CC 43 changes the selected sound’s amp-envelope sustain using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "74",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L74"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 43 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 43,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "AMP RELEASE",
    "action": "CC 72 changes the selected sound’s amp-envelope release using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "75",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L75"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 72 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 72,
    "midi_group": "Envelopes"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO SHAPE",
    "action": "CC 44 changes the selected sound’s LFO shape using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "76",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L76"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 44 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 44,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO RATE",
    "action": "CC 45 changes the selected sound’s LFO rate using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "77",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L77"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 45 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 45,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO DELAY",
    "action": "CC 46 changes the selected sound’s LFO delay using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "78",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L78"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 46 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 46,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO PHASE",
    "action": "CC 47 changes the selected sound’s LFO phase mode using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "79",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L79"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 47 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 47,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO PITCH",
    "action": "CC 48 changes the selected sound’s LFO pitch depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "80",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L80"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 48 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 48,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO PWM",
    "action": "CC 49 changes the selected sound’s LFO pulse-width depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "81",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L81"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 49 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 49,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO FILTER",
    "action": "CC 50 changes the selected sound’s LFO filter depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "82",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L82"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 50 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 50,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "LFO AMP",
    "action": "CC 51 changes the selected sound’s LFO amplitude depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "83",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L83"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 51 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 51,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PITCH TARGET",
    "action": "CC 52 changes the selected sound’s LFO pitch target using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "84",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L84"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 52 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 52,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PWM TARGET",
    "action": "CC 53 changes the selected sound’s LFO pulse-width target using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "85",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L85"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 53 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 53,
    "midi_group": "LFO"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "VOICE MODE",
    "action": "CC 54 changes the selected sound’s voice mode using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "86",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L86"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 54 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 54,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "UNI VOICES",
    "action": "CC 55 changes the selected sound’s unison voice count using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "87",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L87"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 55 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 55,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "UNI DETUNE",
    "action": "CC 56 changes the selected sound’s unison detuning using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "88",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L88"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 56 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 56,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "GLIDE",
    "action": "CC 5 changes the selected sound’s glide time using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "89",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L89"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 5 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 5,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "VINTAGE",
    "action": "CC 57 changes the selected sound’s voice variation using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "90",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L90"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 57 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 57,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "SPREAD",
    "action": "CC 58 changes the selected sound’s stereo spread using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "91",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L91"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 58 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 58,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "BEND RANGE",
    "action": "CC 59 changes the selected sound’s pitch-bend range using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "92",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L92"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 59 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 59,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "SOUND LEVEL",
    "action": "CC 60 changes the selected sound’s program volume using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "93",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L93"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 60 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 60,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MOD WHEEL",
    "action": "CC 1 changes the selected sound’s modulation-wheel depth, adding LFO motion to pitch and filter, with no separate knob for this parameter on the panel pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "94",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L94"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "504-505",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L504-L505"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "571-573",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L571-L573"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_engine.h",
      "lines": "587-589",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_engine.h#L587-L589"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "130-149",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L130-L149"
     }
    ],
    "midi_message": "Control Change 1 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 1,
    "midi_group": "Voice and output"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "ARP MODE",
    "action": "CC 61 changes the selected sound’s arp mode using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "95",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L95"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 61 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 61,
    "midi_group": "Arp and filter morph"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "ARP DIV",
    "action": "CC 62 changes the selected sound’s arp division using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "96",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L96"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 62 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 62,
    "midi_group": "Arp and filter morph"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "ARP OCTAVES",
    "action": "CC 63 changes the selected sound’s arp octave range using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "97",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L97"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 63 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 63,
    "midi_group": "Arp and filter morph"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "ARP GATE",
    "action": "CC 65 changes the selected sound’s arp gate using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "98",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L98"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 65 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 65,
    "midi_group": "Arp and filter morph"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MORPH",
    "action": "CC 66 changes the selected sound’s SEM filter morph using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "99",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L99"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 66 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 66,
    "midi_group": "Arp and filter morph"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CHORUS RATE",
    "action": "CC 67 changes the shared effects’ chorus rate using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "100",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L100"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 67 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 67,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CHORUS DEPTH",
    "action": "CC 68 changes the shared effects’ chorus depth using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "101",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L101"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 68 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 68,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "CHORUS MIX",
    "action": "CC 69 changes the shared effects’ chorus mix using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "102",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L102"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 69 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 69,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "DELAY TIME",
    "action": "CC 70 changes the shared effects’ delay division using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "103",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L103"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 70 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 70,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "DELAY FB",
    "action": "CC 75 changes the shared effects’ delay feedback using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "104",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L104"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 75 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 75,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "DELAY TONE",
    "action": "CC 76 changes the shared effects’ delay feedback tone using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "105",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L105"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 76 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 76,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "DELAY MIX",
    "action": "CC 77 changes the shared effects’ delay mix using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "106",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L106"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 77 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 77,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "REVERB SIZE",
    "action": "CC 78 changes the shared effects’ reverb size using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "107",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L107"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 78 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 78,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "REVERB DAMP",
    "action": "CC 79 changes the shared effects’ reverb damping using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "108",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L108"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 79 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 79,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "PRE-DELAY",
    "action": "CC 80 changes the shared effects’ reverb pre-delay using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "109",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L109"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 80 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 80,
    "midi_group": "Effects"
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "REVERB MIX",
    "action": "CC 81 changes the shared effects’ reverb mix using the incoming value.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "294-303",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L294-L303"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_params.h",
      "lines": "110",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_params.h#L110"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1382-1392",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1382-L1392"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1349-1358",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1349-L1358"
     }
    ],
    "midi_message": "Control Change 81 on the main input channel; non-effects parameters also accept B’s following channel when B owns a program.",
    "midi_cc": 81,
    "midi_group": "Effects"
   }
  ],
  "jack_midi_in": [
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "-",
    "action": "Has no enabled TRS MIDI input in this build, so use USB for incoming MIDI.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "106-110",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L106-L110"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/platform.c",
      "lines": "277-287",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L277-L287"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F3",
    "action": "Plays F3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 1",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 1",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "MUTE A",
    "action": "Toggles track A mute without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "MUTE A",
    "action": "Toggles track A mute without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 1",
    "action": "Selects pattern 1 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 1",
    "action": "Selects pattern 1 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F#3",
    "action": "Plays F#3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 1",
    "action": "Chooses sequencer page 1 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 1",
    "action": "Chooses sequencer page 1 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 1",
    "action": "For a destination other than the current pattern slot, queues slot 1 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 1",
    "action": "For a destination other than the current pattern slot, queues slot 1 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "G3",
    "action": "Plays G3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 2",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 2",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "MUTE B",
    "action": "Toggles track B mute without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "MUTE B",
    "action": "Toggles track B mute without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 2",
    "action": "Selects pattern 2 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 2",
    "action": "Selects pattern 2 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "G#3",
    "action": "Plays G#3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 2",
    "action": "Chooses sequencer page 2 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 2",
    "action": "Chooses sequencer page 2 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 2",
    "action": "For a destination other than the current pattern slot, queues slot 2 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 2",
    "action": "For a destination other than the current pattern slot, queues slot 2 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "A3",
    "action": "Plays A3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 3",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 3",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 3",
    "action": "Selects pattern 3 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 3",
    "action": "Selects pattern 3 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "A#3",
    "action": "Plays A#3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 3",
    "action": "Chooses sequencer page 3 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 3",
    "action": "Chooses sequencer page 3 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 3",
    "action": "For a destination other than the current pattern slot, queues slot 3 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 3",
    "action": "For a destination other than the current pattern slot, queues slot 3 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "B3",
    "action": "Plays B3 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 4",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 4",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 4",
    "action": "Selects pattern 4 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 4",
    "action": "Selects pattern 4 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "C4",
    "action": "Plays C4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 5",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 5",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "SOLO A",
    "action": "Solos track A or releases its existing solo without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "SOLO A",
    "action": "Solos track A or releases its existing solo without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 5",
    "action": "Selects pattern 5 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 5",
    "action": "Selects pattern 5 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "C#4",
    "action": "Plays C#4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 4",
    "action": "Chooses sequencer page 4 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 4",
    "action": "Chooses sequencer page 4 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 4",
    "action": "For a destination other than the current pattern slot, queues slot 4 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 4",
    "action": "For a destination other than the current pattern slot, queues slot 4 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "D4",
    "action": "Plays D4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 6",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 6",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "SOLO B",
    "action": "Solos track B or releases its existing solo without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "SOLO B",
    "action": "Solos track B or releases its existing solo without asking or creating an undo snapshot, and the pattern saves automatically once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 6",
    "action": "Selects pattern 6 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 6",
    "action": "Selects pattern 6 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "D#4",
    "action": "Plays D#4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 5",
    "action": "Chooses sequencer page 5 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 5",
    "action": "Chooses sequencer page 5 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 5",
    "action": "For a destination other than the current pattern slot, queues slot 5 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 5",
    "action": "For a destination other than the current pattern slot, queues slot 5 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "E4",
    "action": "Plays E4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 7",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 7",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 7",
    "action": "Selects pattern 7 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 7",
    "action": "Selects pattern 7 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F4",
    "action": "Plays F4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 8",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 8",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "PATTERN 8",
    "action": "Selects pattern 8 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "PATTERN 8",
    "action": "Selects pattern 8 after saving outgoing edits when stopped, or queues it for A’s loop end while playing; with an older edited pattern already waiting for stop and quiet, an edited current pattern cancels any queued switch before the new request is refused with STOP ONCE, edits made after another switch was queued can be silently discarded while that older pattern is still waiting to be saved, and returning to the waiting pattern loads stale saved contents that can later overwrite its waiting edits, while a changed B program drops unsaved B sound edits and reselecting the current pattern during playback cancels the queue with STAYS.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "875-908",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obv_seq.h",
      "lines": "163-171",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1875",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "159-168",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1443",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1288",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1604-1606",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F#4",
    "action": "Plays F#4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 6",
    "action": "Chooses sequencer page 6 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 6",
    "action": "Chooses sequencer page 6 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 6",
    "action": "For a destination other than the current pattern slot, queues slot 6 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 6",
    "action": "For a destination other than the current pattern slot, queues slot 6 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "G4",
    "action": "Plays G4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 9",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 9",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "G#4",
    "action": "Plays G#4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 7",
    "action": "Chooses sequencer page 7 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 7",
    "action": "Chooses sequencer page 7 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 7",
    "action": "For a destination other than the current pattern slot, queues slot 7 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 7",
    "action": "For a destination other than the current pattern slot, queues slot 7 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "A4",
    "action": "Plays A4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 10",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 10",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "A#4",
    "action": "Plays A#4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "PAGE 8",
    "action": "Chooses sequencer page 8 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "PAGE 8",
    "action": "Chooses sequencer page 8 if it lies within the selected track while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-760",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "COPY TO 8",
    "action": "For a destination other than the current pattern slot, queues slot 8 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "COPY TO 8",
    "action": "For a destination other than the current pattern slot, queues slot 8 to receive whichever pattern is active when stopped and quiet, including intervening edits or pattern switches, requiring the action again within three seconds only for a recognised saved destination and keeping no source snapshot or undo for the overwritten destination.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "911-925",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L911-L925"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1844-1852",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1852"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1880",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1880"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "B4",
    "action": "Plays B4 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 11",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 11",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "C5",
    "action": "Plays C5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 12",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 12",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "C#5",
    "action": "Plays C#5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SEQ key layer while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-762",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L762"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "D5",
    "action": "Plays D5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 13",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 13",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "D#5",
    "action": "Plays D#5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SEQ key layer while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-762",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L762"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "E5",
    "action": "Plays E5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 14",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 14",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F5",
    "action": "Plays F5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 15",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 15",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "F#5",
    "action": "Plays F#5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SEQ key layer while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "123-126",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L123-L126"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "755-762",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L762"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SEQ-layer page or unused key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "-",
    "action": "Changes no musical setting but marks the current pattern edited, allowing a later automatic pattern save when stopped and quiet without asking or creating an undo snapshot.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "G5",
    "action": "Plays G5 shifted by the keyboard octave in the selected sound and sends USB MIDI, unless a key layer or step-entry mode gives this press another job.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1248",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1248"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1266-1295",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1266-L1295"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-189",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L189"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "NOTE OFF",
    "action": "Releases the note started by this key in its original sound and sends USB MIDI when this key began as a note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1309"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "181-187",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L181-L187"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "press",
    "short_label": "WRITE NOTE",
    "action": "With an enabled track, no layer and recording off, plays the key and writes its pitch into the cursor chord, replacing the old chord on the first press, with up to four notes, one pattern undo and a later automatic pattern save when stopped and quiet without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "819-849",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L819-L849"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "release",
    "short_label": "NEXT STEP",
    "action": "Releases this key’s note and advances the cursor once the last key used for this entry is released.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "829-833",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L829-L833"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "press",
    "short_label": "RECORD NOTE",
    "action": "With an enabled track and no key-command layer, plays and records this pitch, starting from step one if armed or overdubbing the nearest step if running, while an enabled arp supplies the recorded notes instead of the raw key, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "231-254",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L231-L254"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1291-1294",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1291-L1294"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1450-1453",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1450-L1453"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "release",
    "short_label": "RECORD GATE",
    "action": "Releases this key and, when raw keys are being recorded, sets the recorded note’s gate or tied length from its held time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "256-281",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L256-L281"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1305-1309",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1305-L1309"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_edit",
    "short_label": "ERASE NOTE",
    "action": "Erases this pitch from every step of the selected track when stopped or as the playhead passes while held during playback, without asking, with one pattern undo and a later automatic save when stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "285-291",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L285-L291"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1276-1280",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1276-L1280"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1455-1459",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1455-L1459"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "short_label": "END ERASE",
    "action": "Stops continuous erasing for the pitch captured when this key went down.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1304",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1304"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press",
    "short_label": "STEP 16",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_seq",
    "short_label": "STEP 16",
    "action": "With recording off, selects this valid step unless it extends an earlier held step, auditions it when stopped and fills empty or disabled steps with the remembered chord and one undo snapshot, while existing enabled steps get no new snapshot before knob edits or the later automatic save without asking.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "699-753",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L699-L753"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "115",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L115"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1869-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1869-L1874"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "short_label": "CLEAR / END",
    "action": "When this is the held step, stops its audition and clears an existing step if it was neither edited nor supplied with MIDI before release, without asking, keeping one pattern undo before the later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "765-779",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L765-L779"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "hold",
    "short_label": "STEP EDIT",
    "action": "Keeps this step selected for NOTE, LEVEL, RATCHET and GATE edits on KNOB 1–4 while recording is off, while incoming main-channel MIDI can replace its chord without a new undo snapshot before a later automatic save.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "728-750",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L750"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "640-649",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1360-1370",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1360-L1370"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b3",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_g4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_a4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_b4",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_c5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_d5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_e5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:key_f5",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-725",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L725"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1838-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "short_label": "TAP TEMPO",
    "action": "Sets tempo from repeated taps less than two seconds apart and silently queues globals for a write after more than two seconds once stopped and quiet with no undo, while every tap also marks the pattern edited for its later silent autosave.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_glo",
    "short_label": "TAP TEMPO",
    "action": "Sets tempo from repeated taps less than two seconds apart and silently queues globals for a write after more than two seconds once stopped and quiet with no undo, while every tap also marks the pattern edited for its later silent autosave.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "791-814",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L791-L814"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1833-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1842"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "press",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_while_holding:button_save",
    "short_label": "-",
    "action": "Does nothing in the SAVE key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1283-1289",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1289"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "873-938",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L873-L938"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1888",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1888"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a GLO-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "release",
    "short_label": "-",
    "action": "Has no release action when this key began as a SAVE-layer key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1300-1313",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1300-L1313"
     }
    ]
   },
   {
    "mode": "step_held",
    "gesture": "press",
    "short_label": "LONG NOTE",
    "action": "If this key’s step on the displayed page lies after the held step within the track, overwrites the steps through that destination with the held chord and ties them together without asking, keeping one pattern undo before the later automatic save once stopped and quiet.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "707-726",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1523-1529",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1840-1842",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
     },
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1863-1874",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1863-L1874"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "PERFORM is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1737",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1737"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "One of the five oscillator or filter pages is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1738",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1738"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "An envelope page is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1739",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1739"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "An LFO page is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1740",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1740"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "An effects page is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1741",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1741"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "GLOBAL, VOICE or OUTPUT is the underlying page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1742",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1742"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "A sequencer view, SEQ layer or EDIT layer is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1736",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1736"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "SAVE READY",
    "action": "A program save is armed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1743",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1743"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "off",
    "short_label": "-",
    "action": "Has no assigned light indication in the instrument loop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1726-1743",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1726-L1743"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "ARP ON",
    "action": "The selected sound’s arpeggiator is enabled, whether or not HOLD is active.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1720-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1720-L1734"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "any",
    "gesture": "flash",
    "short_label": "BEAT",
    "action": "Flashes for about 90 ms on each beat while the sequencer runs.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1718-1730",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1718-L1730"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "rec_ready",
    "gesture": "blinking",
    "short_label": "ARMED",
    "action": "Blinks at quarter-second intervals while recording is armed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1720-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1720-L1734"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "lit",
    "short_label": "RECORDING",
    "action": "Recording is active, including a count-in.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1720-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1720-L1734"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "OCTAVE",
    "action": "The keyboard octave is below zero outside the SEQ key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1722-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1722-L1734"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "lit",
    "short_label": "MORE PAGES",
    "action": "There is an earlier sequencer page while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1722-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1722-L1734"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "OCTAVE",
    "action": "The keyboard octave is above zero outside the SEQ key layer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1722-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1722-L1734"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "lit",
    "short_label": "MORE PAGES",
    "action": "There is a later sequencer page while recording is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1722-1734",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1722-L1734"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "NOTES",
    "action": "Show sounding voice pitches within the keyboard’s current octave range outside the SEQ, GLO and SAVE key layers.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1708-1716",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1708-L1716"
     }
    ]
   },
   {
    "mode": "seq_steps",
    "gesture": "lit",
    "short_label": "CURSOR NOTES",
    "action": "Also show the stored pitches of the cursor step while stopped during step entry or armed recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1712-1715",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1712-L1715"
     }
    ]
   },
   {
    "mode": "seq_more",
    "gesture": "lit",
    "short_label": "CURSOR NOTES",
    "action": "Also show the stored pitches of the cursor step while stopped during step entry or armed recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1712-1715",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1712-L1715"
     }
    ]
   },
   {
    "mode": "rec_ready",
    "gesture": "lit",
    "short_label": "CURSOR NOTES",
    "action": "Also show the stored pitches of the cursor step while stopped during step entry or armed recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1712-1715",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1712-L1715"
     }
    ]
   },
   {
    "mode": "recording",
    "gesture": "lit",
    "short_label": "CURSOR NOTES",
    "action": "Also show the stored pitches of the cursor step while stopped during step entry or armed recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1712-1715",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1712-L1715"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "lit",
    "short_label": "STEP / PAGE",
    "action": "White keys show enabled steps or the held step, the running playhead inverts its step light, and the first eight black keys show the selected available page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1679-1694",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1679-L1694"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "dim",
    "short_label": "LANDMARKS",
    "action": "White steps 1, 5, 9 and 13 glow when not bright, and available unselected page keys glow.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1679-1694",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1679-L1694"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "short_label": "MIX STATE",
    "action": "F3 and G3 show muted A and B, C4 and D4 show solo A and B, and G5 flashes on the running beat.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1695-1701",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1695-L1701"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "dim",
    "short_label": "MIX KEYS",
    "action": "Available mute, solo and tap-tempo keys glow when their bright indication is off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1695-1701",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1695-L1701"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "lit",
    "short_label": "PATTERN NOW",
    "action": "The first eight white keys show the current pattern and a queued destination blinks.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1702-1707",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1702-L1707"
     }
    ]
   },
   {
    "mode": "layer_save",
    "gesture": "dim",
    "short_label": "PATTERN BANK",
    "action": "Other white pattern keys glow, and the first eight black keys glow for recognised saved copy destinations.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "zvenson/obervave",
      "ref": "v1.4.2",
      "commit": "e68d0397c6002a64c7365d24241119401f41119e",
      "path": "firmware/src/obervave.c",
      "lines": "1702-1706",
      "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1702-L1706"
     }
    ]
   }
  ]
 },
 "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"
  ]
 },
 "disagreements": [
  {
   "topic": "Random sound button",
   "docs_say": "The README describes pressing the SELECT knob while holding SAVE.",
   "source_says": "The FM-1 handler listens for button_sel while SAVE is active; the tempo encoder has no push event.",
   "docs_ref": {
    "kind": "doc",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "README.md",
    "lines": "47",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L47"
   },
   "source_ref": {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1586-1591",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1586-L1591"
   }
  },
  {
   "topic": "Switch on B from PATTERNS",
   "docs_say": "The README says KNOB 1 can give an off track sixteen steps on any sequencer view.",
   "source_says": "PATTERNS handles KNOB 1 as slot selection before reaching the off-track length branch; use TRACKS, STEPS, STEP+ or TRACK to enable B.",
   "docs_ref": {
    "kind": "doc",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "README.md",
    "lines": "117",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L117"
   },
   "source_ref": {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "957-980",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L980"
   }
  },
  {
   "topic": "Pattern autosave interval",
   "docs_say": "The README describes the pattern saving three seconds after a change while stopped.",
   "source_says": "The timer starts at the first observation of an edited pattern and is not restarted by subsequent edits; saving also waits for stopped transport, no recording, no held step, no active entry or layer, and quiet voices.",
   "docs_ref": {
    "kind": "doc",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "README.md",
    "lines": "120-121",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L120-L121"
   },
   "source_ref": {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1838-1863",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1838-L1863"
   }
  }
 ],
 "not_mapped": [
  "The second green PLAY light has no independently addressed output in the FM-1 LED driver; the source cannot establish a separate visible meaning for it.",
  "No panel or MIDI backup/restore feature was found in this version; a raw-flash programmer workflow is outside this control map.",
  "Recovery, splash, updater, UBOOT and fault displays are mapped, but fault-number interpretation is outside this owner control map.",
  "Physical TRS MIDI input is disabled in the supplied build; custom builds with other compile flags are outside this map."
 ],
 "metadata_source": [
  {
   "kind": "doc",
   "repo": "zvenson/obervave",
   "ref": "v1.4.2",
   "commit": "e68d0397c6002a64c7365d24241119401f41119e",
   "path": "README.md",
   "lines": "14-23",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L14-L23"
  },
  {
   "kind": "doc",
   "repo": "zvenson/obervave",
   "ref": "v1.4.2",
   "commit": "e68d0397c6002a64c7365d24241119401f41119e",
   "path": "README.md",
   "lines": "145-155",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L145-L155"
  },
  {
   "kind": "doc",
   "repo": "zvenson/obervave",
   "ref": "v1.4.2",
   "commit": "e68d0397c6002a64c7365d24241119401f41119e",
   "path": "LICENSING.md",
   "lines": "3-5",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/LICENSING.md#L3-L5"
  },
  {
   "kind": "doc",
   "repo": "zvenson/obervave",
   "ref": "v1.4.2",
   "commit": "e68d0397c6002a64c7365d24241119401f41119e",
   "path": "LICENSING.md",
   "lines": "12-13",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/LICENSING.md#L12-L13"
  },
  {
   "kind": "doc",
   "repo": "zvenson/obervave",
   "ref": "v1.4.2",
   "commit": "e68d0397c6002a64c7365d24241119401f41119e",
   "path": "LICENSE",
   "lines": "1-17",
   "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/LICENSE#L1-L17"
  }
 ],
 "status": "Independently checked: zero errors in round 3 (2026-10-16), after the round-1 and round-2 fixes. No device testing.",
 "saving_note": {
  "programs": "SAVE twice stores the selected live sound in its program, then writes all saved programs with globals only after more than two seconds, stopped and quiet; program undo is unavailable.",
  "patterns": "Edits are saved automatically once they have waited more than three seconds and transport, recording, held-step entry, layers and voices permit it; even unused GLO-layer keys mark the pattern edited, and SAVE and copy request writes for the next stopped, quiet opportunity. Only one departed edited pattern can wait to save during playback, and it writes without asking only after stopping and becoming quiet. With one already waiting, a switch requested while the current pattern is edited cancels any previously queued switch before being refused with STOP ONCE: THE LAST ONE SAVES. While another pattern is still waiting to be saved, if you queue another switch while the current pattern is clean and then edit it before the change, those new edits are silently lost at the switch. Returning to the waiting pattern before its save loads the older flash copy, which remains active even after the waiting edits save at stop and can overwrite them on a later autosave. Stop and let the sound become quiet before switching again when edits matter.",
  "undo": "One temporary undo snapshot is shared across all pattern slots and survives a pattern switch, so EDIT with OCT- or OCT+ can replace the current slot’s tracks and settings with contents captured in another pattern, without asking, and the result can save automatically once stopped and quiet. Repeat UNDO or REDO before any edit that takes a new snapshot to restore the pattern contents; this cannot restore unsaved B sound edits lost when the swap changed B’s program. Undo does not retrieve a saved program or an overwritten copy destination. Selecting an existing enabled step takes no fresh snapshot before knob edits, and MIDI replacement of a held chord takes none.",
  "source": [
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1494-1505",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1494-L1505"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1519-1522",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1522"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1833-1888",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1888"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "728-741",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L728-L741"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "640-649",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L640-L649"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1364-1370",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1364-L1370"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "875-908",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L875-L908"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obv_seq.h",
    "lines": "163-171",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L171"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1844-1875",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1844-L1875"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "159-168",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1443",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1283-1288",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1604-1606",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "54-55",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L54-L55"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "191-201",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L201"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "209",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L209"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1519-1521",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1519-L1521"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1443",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "159-168",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "957-960",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L957-L960"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1283-1288",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1283-L1288"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1604-1606",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1604-L1606"
   }
  ],
  "pattern_switching": "Only one departed edited pattern can wait to save during playback, and it writes without asking only after stopping and becoming quiet. With one already waiting, a switch requested while the current pattern is edited cancels any previously queued switch before being refused with STOP ONCE: THE LAST ONE SAVES. While another pattern is still waiting to be saved, if you queue another switch while the current pattern is clean and then edit it before the change, those new edits are silently lost at the switch. Returning to the waiting pattern before its save loads the older flash copy, which remains active even after the waiting edits save at stop and can overwrite them on a later autosave. Stop and let the sound become quiet before switching again when edits matter.",
  "b_sound": "Changing patterns to one with a different B program, including a return to sharing A, drops B’s unsaved sound edits without asking; saving a pattern keeps B’s program choice, not the edited sound, so save B’s program first if those edits matter.",
  "cancel_switch": "During playback, choosing the currently playing pattern again with its white key in the SAVE layer, by turning PRESETS back to it on a pattern-selecting view, or with PATTERNS KNOB 3 cancels the queued switch and shows STAYS; it does not clear the separate waiting pattern or save current edits."
 },
 "switching_note": {
  "kept_on_unit": "Keeps 32 saved user programs and globals in one flash sector, plus eight separately saved patterns; each pattern holds both tracks, B’s program choice and its effects-send setting, rather than a copy of either sound. From the flash atlas: install (bundled incoming update loader): Compares the program area at 0x4000–0x92FFF and rewrites differing sectors, checking each write. This area includes M-VAVE Open’s sixteen saved projects, preferences and sample header, so installing OberVave over Open replaces them. The flash head below 0x4000 is left alone (every install or update through its bundled Felucca loader). install completion (update-record removal): Scans every sector tail in this interval and erases a sector if its final 256-byte area starts with an update record with nonzero valid CRC16 over bytes 2..79 and marker 0x5441 at +6. No special skip for project/sample regions (only sectors with a valid update record at their tail). every normal startup: Erases all five update staging sectors if either the first four bytes at 0xE0000 or first eight bytes at 0xE4F00 include a non-FF byte; foreign contents can trigger it (staging probes not blank). first normal startup: No settings or pattern initialization writes: defaults stay in memory until remembered settings change, patterns are edited, or saves and copies schedule writes. update (leaving through upgrade command): Erases all five sectors, writes the incoming package loader there, and after host success writes the 112-byte update record at 0xE4F00. Failure erases staging too. Later writes by the selected incoming loader depend on that package (installer starts upgrade from OberVave). enter USB rescue at power-on: OCT- alone enters USB rescue; entry itself starts neither normal owner-data loading nor boot staging cleanup and writes no flash. An update requested there uses the same updater (OCT- alone held at power-on, or warm-reset guard enters rescue). What OberVave writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over OberVave's is in when_you_leave.",
  "lost": "Unsaved sound edits, the note latch and the one pattern undo snapshot are temporary; selecting a different program replaces its unsaved sound without a question; each saved object has a single copy, so a save interrupted by loss of power has no second copy to fall back on. Changing patterns to one with a different B program, including a return to sharing A, drops B’s unsaved sound edits without asking; saving a pattern keeps B’s program choice, not the edited sound, so save B’s program first if those edits matter. From the flash atlas: No other firmware reads OberVave's data, and OberVave reads none of theirs.",
  "back_up_first": "There is no owner backup or restore command in the panel or MIDI handler read at this tag; write down important settings and do not treat a firmware download as a backup of your programs or patterns.",
  "downgrade": "The settings loader requires its expected size and version, and the pattern loader requires its expected size and format, so another version is not guaranteed to read these saves; the README specifically warns against installing v1.1 because its broken USB MIDI prevents updating away from it.",
  "own_writes": "Missing program or pattern saves start from defaults in memory without saving them at boot, but a normal start can erase another firmware’s data from the entire area OberVave uses for updates before any save action, without asking or offering undo, if either of its two small update checks finds stored data; data elsewhere in that area alone does not trigger the erase, and ordinary settings changes and pattern edits also save later without asking.",
  "install_cleanup": "The installer also removes recognised update records, so do not treat installing a firmware as a guarantee that all saved work remains untouched.",
  "cross_firmware": "Back up what your current firmware can export before switching; see the switching advice in this section. Starting OberVave can erase earlier data before a save, and another firmware can overwrite OberVave work at startup or during use.",
  "source": [
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/platform.c",
    "lines": "121-126",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L121-L126"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/platform.c",
    "lines": "199-240",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L199-L240"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "35-43",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L35-L43"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "191-200",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L191-L200"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1417-1433",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1417-L1433"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obv_seq.h",
    "lines": "14-19",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L14-L19"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1833-1888",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1833-L1888"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/ota.c",
    "lines": "407-421",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/ota.c#L407-L421"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/loader/ldr_core.c",
    "lines": "101-112",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/loader/ldr_core.c#L101-L112"
   },
   {
    "kind": "doc",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "README.md",
    "lines": "14-23",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/README.md#L14-L23"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/ota.c",
    "lines": "35-39",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/ota.c#L35-L39"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/ota.c",
    "lines": "356-360",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/ota.c#L356-L360"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/ota.c",
    "lines": "409-420",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/ota.c#L409-L420"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/platform.c",
    "lines": "443-445",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L443-L445"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "159-168",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L159-L168"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "898-903",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L898-L903"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1443",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1443"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obv_seq.h",
    "lines": "163-169",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obv_seq.h#L163-L169"
   }
  ],
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)",
     "stock voices (128 user patches, banks A-D)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns); stock voices (128 user patches, banks A-D).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "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, button calibration, favourites, MIDI LEARN map.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sample slot USR4 (header at 0xE7000)",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "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 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: user sample slot USR4 (header at 0xE7000) (damaged (part of it written over)); settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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: the whole X0X project (settings, sound, all 32 patterns, song, knob motion).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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, calibration, favourites, MENU options.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "shared user presets U127-U144",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: project C: patterns, song, sounds, motion, recordings (damaged (part of it written over)); project D: patterns, song, sounds, motion, recordings (damaged (part of it written over)); shared user presets U127-U144; settings, factory favourites, calibration, saved template.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "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 tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "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 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: AMB-1 pieces and setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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: options, playing setup and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "by itself, only if the update staging probes contain a nonblank byte",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 8 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you start a firmware update from OberVave (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "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": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install OberVave (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "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": [
     "A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls."
    ],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. A valid user bank stored by an earlier FM-106 build can still be present and readable in Beta4; the bank risks listed here, if any, apply if it exists. FM-106 Beta4’s new user-sound edits are only in memory: panel save, delete and librarian bank commit do not store them, even when they report success. Read the unit into the librarian and export both user banks before switching or powering off; those exports omit sequence notes, locks and extended controls.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you 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)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Optional QY70 style bank",
      "effect": "damaged (part of it written over)",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you request a copy into pattern 8 (no question)",
        "effect": "damaged (part of it written over)"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "damaged (part of it written over)"
       }
      ]
     },
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (it asks or arms a second turn about the target slot only; it rewrites the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Optional QY70 style bank (damaged (part of it written over)); Polly setup and channel sounds.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "shared 64-pattern pool",
      "effect": "some or all of it lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 1 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 2 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 3 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 4 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 5 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 6 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 7 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you request a copy into pattern 8 (no question)",
        "effect": "some or all of it lost"
       },
       {
        "way": "when you tap SAVE in the sequencer (no question)",
        "effect": "some or all of it lost"
       }
      ]
     },
     {
      "object": "settings, calibration and favourites",
      "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: shared 64-pattern pool (some or all of it lost); settings, calibration and favourites.",
    "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": [
     "pattern 1",
     "pattern 2",
     "pattern 3",
     "pattern 4",
     "pattern 5",
     "pattern 6",
     "pattern 7",
     "pattern 8"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): pattern 1; pattern 2; pattern 3; pattern 4; pattern 5; pattern 6; pattern 7; pattern 8.",
    "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": [
     "pattern 1",
     "pattern 2",
     "pattern 3",
     "pattern 4",
     "pattern 5",
     "pattern 6",
     "pattern 7",
     "pattern 8"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): pattern 1; pattern 2; pattern 3; pattern 4; pattern 5; pattern 6; pattern 7; pattern 8.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if its 2ND CORE is on and a render job fails or times out",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CCs (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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": "by itself, only if its 2ND CORE is on and a render job fails or times out [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 erase a user preset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you learn MIDI CCs (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor [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 data from the web 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)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "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 erase a sample slot from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you upload samples or break loops (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "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": "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 load a song file or a LIVE playlist song (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save the song order (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 or remove a theme from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send the song from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you store a section (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 store drum kits from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings; pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACS",
    "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": "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": "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": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only after a retained second-core failure, if two cores were enabled [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 back up pending project edits over USB (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 do a factory reset (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a USB restore (staging erases before the device question) (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change settings from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you 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 star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: 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)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you quick-save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a project (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if a matching committed preset bank needs repair or conversion, or legacy Prophet conversion needs spill space",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a previously confirmed user-preset wipe was interrupted",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm recovery wipe of all user presets (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx into slots (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a user preset (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you change a setting (no question)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting in the menu (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (no question)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send data from the web editor (no question)",
        "effect": "lost"
       },
       {
        "way": "when you star a favourite (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change a setting in the menu (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you save a template (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send data from the web editor (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you star a favourite (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings; pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "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": "by itself, only if core failure barred Dual Core while the stored setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (no question)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (no question)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question)",
        "effect": "lost"
       },
       {
        "way": "when you restore settings from backup software (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "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": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself, only if core failure barred Dual Core while the stored setting was On [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (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 hold SAVE for a global save (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you keep calibration or enter update with OCT- + OCT+ + HOME held for 5 s (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore settings from backup software (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "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)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "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": "pattern 2",
      "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": "pattern 3",
      "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": "pattern 4",
      "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": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (no question; it rewrites the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: pattern 1; pattern 2; pattern 3; pattern 4; pattern 5; pattern 6; pattern 7; pattern 8; saved programs and global settings.",
    "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": "saved programs and global settings",
      "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"
       }
      ]
     },
     {
      "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 confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm deletion of the active user slot (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you press SAVE in the save screen (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 release a short SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "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 calibrate the panel (no question)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (no question)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you calibrate the panel (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 remember or forget a Bluetooth device (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 8",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you install a QY70 style bank (no question)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send a backup for USB restore (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESTORE FROM USB on the FM-1 (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (no question)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore (no question)",
        "effect": "lost"
       },
       {
        "way": "when you start a stopped USB backup or enter a test session (no question)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "pattern 1",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 2",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 3",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 4",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 5",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 6",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 7",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "pattern 8",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "by itself, only if a readable old project needs pattern migration",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first) [through its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you confirm 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"
       }
      ],
      "first_way_effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
     },
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself at its first start",
        "effect": "lost"
       },
       {
        "way": "by itself as you use it",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (no question)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (it asks or arms a second turn first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a full backup in the web editor (it asks or arms a second turn first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain; other writes can also erase it); saved programs and global settings.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 startup erases foreign data",
   "fixed": "Named conditional startup erasure, lack of confirmation or undo, both switching directions and the missing switching-table status.",
   "at": "switching_note.own_writes; switching_note.cross_firmware; Markdown Before you switch firmware"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.encoder_knob4[22]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_fs3[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_fs3[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_gs3[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_gs3[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_as3[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_as3[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_cs4[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_cs4[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_ds4[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_ds4[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_fs4[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_fs4[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_gs4[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_gs4[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_as4[18]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Explained that only the destination is queued and the pattern active at write time supplies the copied data.",
   "at": "controls.key_as4[19]; matching Markdown copy row"
  },
  {
   "round": 1,
   "error": "2 deferred copy source",
   "fixed": "Corrected the source-at-write-time condition for all eight pattern copy triggers.",
   "at": "refresh/work/obervave.storage.json objects[1-8].written_when[3]"
  },
  {
   "round": 1,
   "error": "3 destructive OSC 1 navigation",
   "fixed": "Replaced the broad EDIT instruction with HOME then EDIT, excluding the STEPS and STEP+ rest gesture.",
   "at": "modes[1].how_to_get_there; Markdown modes table"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f3[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f3[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g3[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g3[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_a3[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_a3[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_b3[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_b3[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_c4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_c4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_d4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_d4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_e4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_e4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_a4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_a4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_b4[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_b4[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_c5[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_c5[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_d5[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_d5[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_e5[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_e5[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f5[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_f5[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g5[13]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Limited the snapshot to filling an empty or disabled step and removed the undo promise for later edits of an existing step.",
   "at": "controls.key_g5[14]; Markdown SEQ-layer key row"
  },
  {
   "round": 1,
   "error": "4 conditional step undo",
   "fixed": "Added the existing-step and held-MIDI snapshot limits to the saving summary.",
   "at": "saving_note.undo; matching Markdown saving paragraph"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_f3[23-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g3[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_g3[24-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a3[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a3[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_a3[25-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b3[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b3[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b3[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_b3[26-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_c4[27-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_d4[28-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e4[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_e4[29-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f4[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_f4[30-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g4[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_g4[31-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_a4[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_a4[32-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_b4[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_b4[33-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_c5[27]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_c5[34-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[27]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_d5[28]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_d5[35-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[27]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[28]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_e5[29]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_e5[36-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[27]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[28]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[29]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_f5[30]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_f5[37-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[17]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[18]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[19]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[20]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[21]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[22]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[23]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[24]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[25]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[26]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[27]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[28]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[29]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[30]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Made the condition depend on absolute track position rather than physical key order.",
   "at": "controls.key_g5[31]; matching Markdown long-note row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Appended later-page destinations reached with lower physical keys and a state-specific destination press.",
   "at": "controls.key_g5[38-38]"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Explained that changing page preserves the held step and enables cross-page overwrite.",
   "at": "controls.button_oct_down[1]; matching Markdown page row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Explained that changing page preserves the held step and enables cross-page overwrite.",
   "at": "controls.button_oct_down[2]; matching Markdown page row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Explained that changing page preserves the held step and enables cross-page overwrite.",
   "at": "controls.button_oct_up[1]; matching Markdown page row"
  },
  {
   "round": 1,
   "error": "5 cross-page long notes",
   "fixed": "Explained that changing page preserves the held step and enables cross-page overwrite.",
   "at": "controls.button_oct_up[2]; matching Markdown page row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_f3[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_g3[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_a3[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_b3[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_c4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_d4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_e4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_f4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_g4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_a4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_b4[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_c5[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_d5[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_e5[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_f5[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Added the destructive MIDI replacement warning to the held-step instruction.",
   "at": "controls.key_g5[16]; Markdown held-step row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Appended the main-channel held-step replacement, velocity, chord limit and missing snapshot.",
   "at": "controls.jack_usb[1]; Markdown held-step MIDI row"
  },
  {
   "round": 1,
   "error": "6 MIDI held-chord replacement",
   "fixed": "Named cross-page extension, unsnapshotted held-step MIDI replacement and existing-step knob edits as autosave triggers.",
   "at": "refresh/work/obervave.storage.json objects[1-8].written_when[0]"
  },
  {
   "round": 1,
   "error": "Storage PARTLY interior bytes",
   "fixed": "Replaced unconditional header-rejection claims with the exact conditional loader checks and the unverified-interior-byte limit.",
   "at": "refresh/work/obervave.storage.json reads_foreign[9,10,14,15,19,20,24,25,29,30,34,35,39]"
  },
  {
   "round": 1,
   "error": "7 USB MIDI coverage",
   "fixed": "Appended channel routing, notes and releases, pitch bend, sustain, panic, overall volume, program changes, all 63 parameter CCs, clock/start/continue/stop and MIDI cursor/live entry with save consequences.",
   "at": "controls.jack_usb[2-85]; midi_note; Markdown Play and edit over USB MIDI"
  },
  {
   "round": 2,
   "error": "7 USB MIDI Markdown modes (round-2 report item 1)",
   "fixed": "Restored STEPS or STEP+ as the cursor-entry condition and REC armed or active as the recording condition; swept all 85 MIDI entries and 63 parameter CC rows against their JSON actions and message context, with no other differences found.",
   "at": "control-maps/obervave.md Enter steps and record rows 2-3; controls.jack_usb[18-21] mode context"
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.encoder_knob3[22]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.encoder_presets[1]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.encoder_presets[2]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.encoder_presets[3]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.encoder_presets[4]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_f3[19]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_f3[20]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_g3[20]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_g3[21]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_a3[21]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_a3[22]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_b3[22]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_b3[23]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_c4[23]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_c4[24]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_d4[24]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_d4[25]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_e4[25]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_e4[26]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_f4[26]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "controls.key_f4[27]; corresponding Markdown row",
   "fixed": "Replaced the pending-edits guarantee with the single-buffer refusal, edit-after-queue discard and stale-return overwrite conditions, including stopped-and-quiet write timing.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "saving_note.patterns; saving_note.pattern_switching; Markdown saving paragraphs",
   "fixed": "Added the three pending-pattern failure cases and the stop-and-quiet precaution.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "controls.button_oct_down[3]; corresponding Markdown undo row",
   "fixed": "Explained cross-pattern snapshot replacement of the current slot, automatic overwrite, immediate repeat recovery and unrecoverable B sound edits.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "controls.button_oct_down[4]; corresponding Markdown undo row",
   "fixed": "Explained cross-pattern snapshot replacement of the current slot, automatic overwrite, immediate repeat recovery and unrecoverable B sound edits.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "controls.button_oct_up[3]; corresponding Markdown undo row",
   "fixed": "Explained cross-pattern snapshot replacement of the current slot, automatic overwrite, immediate repeat recovery and unrecoverable B sound edits.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "controls.button_oct_up[4]; corresponding Markdown undo row",
   "fixed": "Explained cross-pattern snapshot replacement of the current slot, automatic overwrite, immediate repeat recovery and unrecoverable B sound edits.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "saving_note.undo; Markdown saving summary",
   "fixed": "Made snapshot scope, current-slot overwrite, repeat recovery limits and B timbre loss explicit.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "4",
   "at": "switching_note.lost; saving_note.b_sound; controls.encoder_knob3[22], controls.encoder_presets[1], controls.encoder_presets[2], controls.encoder_presets[3], controls.encoder_presets[4], controls.key_f3[19], controls.key_f3[20], controls.key_g3[20], controls.key_g3[21], controls.key_a3[21], controls.key_a3[22], controls.key_b3[22], controls.key_b3[23], controls.key_c4[23], controls.key_c4[24], controls.key_d4[24], controls.key_d4[25], controls.key_e4[25], controls.key_e4[26], controls.key_f4[26], controls.key_f4[27]; matching Markdown text",
   "fixed": "Warned that an incoming different B program drops unsaved B sound edits, independently of saving the pattern.",
   "why": "firmware/src/obervave.c:159-168,898-903,1443@e68d039; firmware/src/obv_seq.h:163-169@e68d039."
  },
  {
   "round": "spot-1",
   "error": "5",
   "at": "saving_note.cancel_switch; controls.encoder_knob3[22], controls.encoder_presets[1], controls.encoder_presets[2], controls.encoder_presets[3], controls.encoder_presets[4], controls.key_f3[19], controls.key_f3[20], controls.key_g3[20], controls.key_g3[21], controls.key_a3[21], controls.key_a3[22], controls.key_b3[22], controls.key_b3[23], controls.key_c4[23], controls.key_c4[24], controls.key_d4[24], controls.key_d4[25], controls.key_e4[25], controls.key_e4[26], controls.key_f4[26], controls.key_f4[27]; matching Markdown rows",
   "fixed": "Added reselect-current cancellation with STAYS, separate from the pending-save buffer.",
   "why": "firmware/src/obervave.c:893-896,957-960,1283-1288,1604-1606@e68d039."
  },
  {
   "round": "spot-1",
   "error": "6",
   "at": "controls.encoder_knob4[24]; matching Markdown length row",
   "fixed": "Replaced the one-step-at-a-time claim with slow increments and tripled fast-turn movement.",
   "why": "firmware/src/obervave.c:653-654,1633-1636@e68d039."
  },
  {
   "round": "spot-1",
   "error": "6",
   "at": "controls.encoder_knob4[25]; matching Markdown length row",
   "fixed": "Replaced the one-step-at-a-time claim with slow increments and tripled fast-turn movement.",
   "why": "firmware/src/obervave.c:653-654,1633-1636@e68d039."
  },
  {
   "round": "spot-1",
   "error": "7",
   "at": "controls.screen[18]; matching Markdown row",
   "fixed": "Repaired the sentence without changing its control function.",
   "why": "firmware/src/obervave.c:1167-1192@e68d039"
  },
  {
   "round": "spot-1",
   "error": "7",
   "at": "controls.encoder_knob1[10]; matching Markdown row",
   "fixed": "Repaired the sentence without changing its control function.",
   "why": "firmware/src/obv_params.h:141@e68d039; firmware/src/obervave.c:1660-1662@e68d039"
  },
  {
   "round": "spot-1",
   "error": "7",
   "at": "controls.encoder_knob2[10]; matching Markdown row",
   "fixed": "Repaired the sentence without changing its control function.",
   "why": "firmware/src/obv_params.h:141@e68d039; firmware/src/obervave.c:1660-1662@e68d039"
  },
  {
   "round": "spot-1",
   "error": "7",
   "at": "lights.button_oct_up[1]; matching Markdown light row",
   "fixed": "Corrected the article before later.",
   "why": "firmware/src/obervave.c:1722-1734@e68d039."
  },
  {
   "round": "spot-1",
   "error": "8",
   "at": "part_id_notes; Markdown USB connection note",
   "fixed": "Documented jack_usb as a retained alias for shared-list jack_usb_c rather than renaming the part.",
   "why": "refresh/method/controlmap-format.md:51 names jack_usb_c; control-maps/fomni.json part_id_notes records the drawing reconciliation to jack_usb; USB functionality is firmware/src/platform.c:100-110@e68d039."
  },
  {
   "round": "spot-1",
   "error": "1",
   "at": "refresh/work/obervave.storage.json objects[1-8].written_when[1]; pattern_switching_note",
   "fixed": "Replaced guaranteed pending-save language with the one-buffer refusal, silent discard and stale-reload overwrite cases.",
   "why": "firmware/src/obervave.c:893-903,1844-1875@e68d039; firmware/src/obv_seq.h:163-171@e68d039: one pending buffer, refusal before queuing, flash reload and dirty-flag reset."
  },
  {
   "round": "spot-1",
   "error": "2",
   "at": "refresh/work/obervave.storage.json objects[1-8].written_when[0]; objects[1-8].load_rule; undo_note",
   "fixed": "Recorded snapshot persistence, replacement of the current slot, recovery limits and B sound loss.",
   "why": "firmware/src/obervave.c:54-55,191-201,209,1519-1521,1443,159-168@e68d039: the shared snapshot survives loads, the swap marks the current slot edited and changing B program reloads its saved patch."
  },
  {
   "round": "spot-1",
   "error": "4",
   "at": "refresh/work/obervave.storage.json objects[1-8].load_rule; objects[1-8].written_when[1]; b_sound_note",
   "fixed": "Distinguished saved B references from unsaved sound edits dropped on a changed B program.",
   "why": "firmware/src/obervave.c:159-168,898-903,1443@e68d039; firmware/src/obv_seq.h:163-169@e68d039"
  },
  {
   "round": "spot-1",
   "error": "5",
   "at": "refresh/work/obervave.storage.json objects[1-8].written_when[1]; cancel_switch_note",
   "fixed": "Recorded queue cancellation with STAYS without clearing the pending-save buffer.",
   "why": "firmware/src/obervave.c:893-896@e68d039"
  },
  {
   "round": "spot-2",
   "error": "1",
   "at": "controls.encoder_knob3[22]; controls.encoder_presets[1]; controls.encoder_presets[2]; controls.encoder_presets[3]; controls.encoder_presets[4]; controls.key_f3[19]; controls.key_f3[20]; controls.key_g3[20]; controls.key_g3[21]; controls.key_a3[21]; controls.key_a3[22]; controls.key_b3[22]; controls.key_b3[23]; controls.key_c4[23]; controls.key_c4[24]; controls.key_d4[24]; controls.key_d4[25]; controls.key_e4[25]; controls.key_e4[26]; controls.key_f4[26]; controls.key_f4[27]; corresponding Markdown rows; saving_note.patterns; saving_note.pattern_switching; corresponding Markdown saving paragraph; refresh/work/obervave.storage.json pattern_switching_note and objects[1-8].written_when[1].trigger",
   "fixed": "Stated that STOP ONCE cancels any previously queued switch before refusing the new request.",
   "why": "firmware/src/obervave.c:893-896@e68d039: queue flags are cleared before the refusal check."
  },
  {
   "round": "spot-2",
   "error": "2",
   "at": "controls.encoder_knob3[22]; controls.encoder_presets[1]; controls.encoder_presets[2]; controls.encoder_presets[3]; controls.encoder_presets[4]; controls.key_f3[19]; controls.key_f3[20]; controls.key_g3[20]; controls.key_g3[21]; controls.key_a3[21]; controls.key_a3[22]; controls.key_b3[22]; controls.key_b3[23]; controls.key_c4[23]; controls.key_c4[24]; controls.key_d4[24]; controls.key_d4[25]; controls.key_e4[25]; controls.key_e4[26]; controls.key_f4[26]; controls.key_f4[27]; corresponding Markdown rows; saving_note.patterns; saving_note.pattern_switching; corresponding Markdown saving paragraph; refresh/work/obervave.storage.json pattern_switching_note and objects[1-8].written_when[1].trigger/condition_short",
   "fixed": "Made the waiting-pattern condition explicit in every statement about losing edits made after queuing.",
   "why": "firmware/src/obervave.c:897,1847-1851@e68d039; firmware/src/obv_seq.h:163-167@e68d039: with no older pending pattern, the outgoing edits are retained for saving."
  },
  {
   "round": "spot-2",
   "error": "3",
   "at": "control-maps/obervave.md USB-C connection section; part_id_notes unchanged",
   "fixed": "Removed the internal USB part-id paragraph from the owner guide; retained the alias explanation in part_id_notes.",
   "why": "Owner-facing wording correction; no firmware behavior changed."
  },
  {
   "round": "overlay-1",
   "error": "OberVave 5: all plain key presses labelled NOTE ON",
   "at": "controls.key_f3[0].short_label; controls.key_fs3[0].short_label; controls.key_g3[0].short_label; controls.key_gs3[0].short_label; controls.key_a3[0].short_label; controls.key_as3[0].short_label; controls.key_b3[0].short_label; controls.key_c4[0].short_label; controls.key_cs4[0].short_label; controls.key_d4[0].short_label; controls.key_ds4[0].short_label; controls.key_e4[0].short_label; controls.key_f4[0].short_label; controls.key_fs4[0].short_label; controls.key_g4[0].short_label; controls.key_gs4[0].short_label; controls.key_a4[0].short_label; controls.key_as4[0].short_label; controls.key_b4[0].short_label; controls.key_c5[0].short_label; controls.key_cs5[0].short_label; controls.key_d5[0].short_label; controls.key_ds5[0].short_label; controls.key_e5[0].short_label; controls.key_f5[0].short_label; controls.key_fs5[0].short_label; controls.key_g5[0].short_label",
   "fixed": "Replaced NOTE ON with each key’s default note, F3 through G5; default octave matches the shared part names. The Markdown does not print these short labels and is unchanged.",
   "why": "firmware/src/obervave.c:1248,1268-1275,1290-1292,1417-1425@e68d039: KEY0 is MIDI note 53, key index adds semitones, and default settings set the octave shift to zero."
  }
 ],
 "checker_disputes_refresh": [],
 "cross_page_note": {
  "action": "For a track longer than sixteen steps, hold SEQ and G5 on page 1, press OCT+, then press F3 while keeping G5 held: steps 16–17 become one tied chord and step 17 is overwritten without a question; one pattern undo is captured, and the result can save automatically once stopped and quiet.",
  "evidence": "read-in-source",
  "source": [
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "707-726",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L707-L726"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "755-760",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L755-L760"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1523-1529",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1523-L1529"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1840-1842",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1840-L1842"
   }
  ]
 },
 "midi_note": {
  "action": "Send these messages over USB MIDI; TRS MIDI IN is disabled in this build, ordinary main-channel notes use the sound selected on the panel, and clock and transport messages are handled before channel filtering.",
  "evidence": "read-in-source",
  "source": [
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/platform.c",
    "lines": "106-110",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/platform.c#L106-L110"
   },
   {
    "kind": "source",
    "repo": "zvenson/obervave",
    "ref": "v1.4.2",
    "commit": "e68d0397c6002a64c7365d24241119401f41119e",
    "path": "firmware/src/obervave.c",
    "lines": "1330-1362",
    "url": "https://github.com/zvenson/obervave/blob/e68d0397c6002a64c7365d24241119401f41119e/firmware/src/obervave.c#L1330-L1362"
   }
  ]
 }
}