{
 "firmware": "Rainbow Mode",
 "slug": "rainbow",
 "author": "joshbartlettband-web; based on Felucca by Leo Kuroshita / Hügelton Instruments",
 "repo": "https://github.com/joshbartlettband-web/felucca-rainbow",
 "licence": "GPL-3.0-only",
 "closed_source": false,
 "mapped_release": "1.1.5-rb",
 "mapped_commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
 "release_date": "2026-10-15",
 "date_mapped": "2026-10-17",
 "status": "Independently checked: zero errors in round 3 (2026-10-17), after the round-1 and round-2 fixes. No device testing.",
 "turns_it_into": "A music toy with animal and character friends, musical games and a small song writer, with the full four-track Felucca synthesizer behind a grown-ups’ button combination.",
 "version_note": {
  "build": "Public FM-1 package from workflow run 38745022376, built at 2539ec9; this version has no tag or release page.",
  "pin_provenance": "The maker brief records a 2026-10-17 check of installer-pin.txt on main and the workflow artifact: the hub package (SHA-256 prefix 804c7785) matches public/felucca-1.1.5-rb.fwsc byte for byte; this session read the supplied source without network access.",
  "public_and_private": "The public build has no built-in greeting name; the private artifact from this same mapped workflow run adds one, and a name saved on the unit overrides it. The private installer follows newer builds, so this map does not describe the package it currently serves.",
  "latest_push": "The maker brief identifies c893b18 (2026-10-16) as the newest push, whose package neither the public installer nor the hub serves; it is outside this map.",
  "stars": "COPY ME stars are kept only in memory in this build and reset when the play mode changes.",
  "source": [
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": ".github/workflows/rainbow.yml",
    "lines": "100-130",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/.github/workflows/rainbow.yml#L100-L130"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "tools/build.py",
    "lines": "59-63",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/build.py#L59-L63"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "tools/gen_kid_art.py",
    "lines": "2043-2052",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L2043-L2052"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "44-47",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L44-L47"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "844-870",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L844-L870"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1437-1445",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1437-L1445"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1483-1490",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1483-L1490"
   }
  ],
  "private_installer_provenance": "The independent check dated 2026-10-17 reports a read-only check of installer-pin.txt on main: the public installer is pinned, while the private installer follows the newest build; newer private packages include behavior outside 2539ec9."
 },
 "docs": [
  {
   "title": "Rainbow Mode guide",
   "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md",
   "path": "RAINBOW.md",
   "ref": "1.1.5-rb",
   "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
   "read_at": "2026-10-17"
  },
  {
   "title": "Rainbow and inherited Felucca README",
   "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/README.md",
   "path": "README.md",
   "ref": "1.1.5-rb",
   "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
   "read_at": "2026-10-17"
  }
 ],
 "install": {
  "official": "https://joshbartlettband-web.github.io/felucca-rainbow/",
  "hub": "https://thefirmwarehub.com/"
 },
 "part_id_notes": "SEL is B_SCL in the source; ALGORITHM, PRESETS and SELECT are endless encoders without a push action. Button lights use lights.button_*; the two PLAY lamps are identified by light when needed. groups.key_lights lists the 27 white key lamps. Modes starting rainbow_ describe the toy; mode felucca covers common full-Felucca actions only, and the remaining inherited mode ids describe its individual pages and layers.",
 "modes": [
  {
   "id": "rainbow_play",
   "name": "Rainbow shared controls",
   "how_to_get_there": "Switch on, or leave WRITE with SAVE.",
   "what_it_is": "These actions apply throughout Rainbow play and WRITE unless a more specific page entry changes their job; NAME has its own controls.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1605-1615",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1605-L1615"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "3388-3400",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3388-L3400"
    }
   ]
  },
  {
   "id": "rainbow_one",
   "name": "1 FRIEND",
   "how_to_get_there": "Switch on, or turn ALGORITHM fully left.",
   "what_it_is": "Play the selected friend as a normal instrument.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "344-346",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L344-L346"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1465-1492",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1465-L1492"
    }
   ]
  },
  {
   "id": "rainbow_choir",
   "name": "3 FRIENDS",
   "how_to_get_there": "Turn ALGORITHM to 3 FRIENDS.",
   "what_it_is": "Keys produce three-note chords in C major and the picture gains two companions.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "344-346",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L344-L346"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "546-563",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L563"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "2099-2103",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2099-L2103"
    }
   ]
  },
  {
   "id": "rainbow_strum",
   "name": "STRUM",
   "how_to_get_there": "Turn ALGORITHM to STRUM.",
   "what_it_is": "Choose a chord on a black key and sweep its notes on the white keys.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1465-1482",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1465-L1482"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/seq.c",
     "lines": "94-111",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L111"
    }
   ]
  },
  {
   "id": "rainbow_accordion",
   "name": "ACCORDION",
   "how_to_get_there": "Turn ALGORITHM to ACCORDION.",
   "what_it_is": "Black keys hold chords beneath a tune played on white keys.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1465-1482",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1465-L1482"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/seq.c",
     "lines": "582-594",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
    }
   ]
  },
  {
   "id": "rainbow_guess",
   "name": "GUESS",
   "how_to_get_there": "Turn ALGORITHM to GUESS.",
   "what_it_is": "Find the note the friend plays; three consecutive correct answers add a note to the choice pool.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1495-1540",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
    }
   ]
  },
  {
   "id": "rainbow_follow",
   "name": "FOLLOW",
   "how_to_get_there": "Turn ALGORITHM to FOLLOW.",
   "what_it_is": "Play the lit next key of one of 17 songs at your own pace.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1283-1306",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1283-L1306"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1542-1554",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
    }
   ]
  },
  {
   "id": "rainbow_chords",
   "name": "CHORDS",
   "how_to_get_there": "Turn ALGORITHM to CHORDS.",
   "what_it_is": "Match the lit chord exactly, freely or with one chord for each bar of the LOFI accompaniment.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1328-1359",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1328-L1359"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1555-1576",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
    }
   ]
  },
  {
   "id": "rainbow_copy",
   "name": "COPY ME",
   "how_to_get_there": "Turn ALGORITHM to COPY ME.",
   "what_it_is": "Repeat a growing pattern on C4, D4, E4, G4 and A4; eight notes complete the round and restart with two.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1376-1463",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1376-L1463"
    }
   ]
  },
  {
   "id": "rainbow_write",
   "name": "WRITE stopped",
   "how_to_get_there": "Press SAVE during Rainbow play.",
   "what_it_is": "A song has 32 columns with up to two notes per column and up to three friends; its length rounds up to its last occupied four-column bar. Entering can replace a song part with the current friend; only the first visit after each power-on reloads stored tempo, and later visits retain the toy’s current tempo until changed.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "417-432",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L417-L432"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1094-1104",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1094-L1104"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1188-1220",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1188-L1220"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1195-1201",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1195-L1201"
    }
   ]
  },
  {
   "id": "rainbow_write_play",
   "name": "WRITE playing",
   "how_to_get_there": "Press PLAY in WRITE.",
   "what_it_is": "The written song loops while the keys can play along without editing it. Entering can replace a song part with the current friend; only the first visit after each power-on reloads stored tempo, and later visits retain the toy’s current tempo until changed.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1246-1251",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1644-1668",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1644-L1668"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1195-1201",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1195-L1201"
    }
   ]
  },
  {
   "id": "rainbow_name",
   "name": "YOUR NAME",
   "how_to_get_there": "Hold HOME for at least one second outside WRITE, then turn ALGORITHM.",
   "what_it_is": "Edit ten positions with spaces or A–Z; the screen changes, while the keyboard still plays its current sound.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "877-937",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L937"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/seq.c",
     "lines": "729-784",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
    }
   ]
  },
  {
   "id": "rainbow_volume",
   "name": "VOLUME",
   "how_to_get_there": "Hold HOME for at least one second and keep holding it.",
   "what_it_is": "Eight maximum-volume steps limit MASTER, starting at step six; releasing HOME closes the grown-ups controls.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "725-749",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L725-L749"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1730-1780",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1730-L1780"
    }
   ]
  },
  {
   "id": "rainbow_look",
   "name": "LOOK-ALIKES",
   "how_to_get_there": "Hold HOME for at least one second, then turn PRESETS.",
   "what_it_is": "Swap the pictures and names of look-alike friends for stand-ins while keeping their sounds.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "434-446",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L434-L446"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "819-827",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L819-L827"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1852-1854",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1852-L1854"
    }
   ]
  },
  {
   "id": "rainbow_hat",
   "name": "HAT",
   "how_to_get_there": "Hold HOME for at least one second, then turn KNOB 4.",
   "what_it_is": "Pick a hat for the friends, or choose none.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "938-951",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L938-L951"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1902-1906",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1902-L1906"
    }
   ]
  },
  {
   "id": "rainbow_hello",
   "name": "Power-on hello",
   "how_to_get_there": "Switch on, or save a name in YOUR NAME.",
   "what_it_is": "A greeting lasts up to four seconds and yields to most panel input; the public build has no name until one is set.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "64-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L64-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "751-763",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L751-L763"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "860-875",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L860-L875"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1914-1917",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1914-L1917"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "3308-3321",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3308-L3321"
    }
   ]
  },
  {
   "id": "rainbow_drums",
   "name": "Drum friends",
   "how_to_get_there": "Choose Scissors, Beat Bot, Toy Drum, Bongo or Monkey with PRESETS.",
   "what_it_is": "The keys address drums rather than pitched notes; STRUM, ACCORDION and chord building leave this drum mapping alone.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "135",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L135"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "171-174",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L171-L174"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "557-560",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/seq.c",
     "lines": "115-124",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/eng_drum.c",
     "lines": "302-306",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
    }
   ]
  },
  {
   "id": "home",
   "name": "HOME",
   "how_to_get_there": "In full Felucca, release HOME.",
   "what_it_is": "Four main sound controls for the selected track over an oscilloscope.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "598-605",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L598-L605"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "1291-1297",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
    }
   ]
  },
  {
   "id": "mixer",
   "name": "MIXER",
   "how_to_get_there": "Press GLO from another family; further taps cycle MIXER, GLOBAL, SYSTEM.",
   "what_it_is": "Level, pan, reverb send and mute for the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "385",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L385"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "env",
   "name": "ENV",
   "how_to_get_there": "Press ENV; press it again to step through its pages in order.",
   "what_it_is": "Attack, decay, sustain, release of the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "350",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "env_dest",
   "name": "ENV DEST",
   "how_to_get_there": "Press ENV again from ENV.",
   "what_it_is": "Envelope amounts for filter, pitch and shape.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "351",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "lfo",
   "name": "LFO",
   "how_to_get_there": "Press LFO; press it again to step through its pages in order.",
   "what_it_is": "LFO rate, wave, phase, fade-in.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "352",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "lfo_dest",
   "name": "LFO DEST",
   "how_to_get_there": "Press LFO; press it again to step through its pages in order.",
   "what_it_is": "LFO amounts to pitch, filter, shape, volume.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "353",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "mod",
   "name": "MOD",
   "how_to_get_there": "Press LFO; press it again to step through its pages in order.",
   "what_it_is": "Modulation matrix: four slots of source, destination, amount.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "354",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "fx",
   "name": "FX",
   "how_to_get_there": "Press FX; press it again to step through its pages in order.",
   "what_it_is": "The track's distortion and its chorus, delay and reverb sends.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "355",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "slicer",
   "name": "SLICER",
   "how_to_get_there": "Press FX; press it again to step through its pages in order.",
   "what_it_is": "The track's rhythmic slicer.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "356",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "dly",
   "name": "DLY",
   "how_to_get_there": "Press FX; press it again to step through its pages in order.",
   "what_it_is": "The shared delay.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "357",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "reverb",
   "name": "REVERB",
   "how_to_get_there": "Press FX repeatedly to REVERB.",
   "what_it_is": "The shared reverb has ROOM and SPRING models.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "358",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "chorus",
   "name": "CHORUS",
   "how_to_get_there": "Press FX; press it again to step through its pages in order.",
   "what_it_is": "The shared chorus.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "359",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "scl",
   "name": "SCL",
   "how_to_get_there": "Press SEL (Felucca calls it SCL); press it again to step through its pages in order.",
   "what_it_is": "The track's key, scale, how the keys follow it, transpose.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "360",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "chord",
   "name": "CHORD",
   "how_to_get_there": "Press SEL (Felucca calls it SCL); press it again to step through its pages in order.",
   "what_it_is": "One-finger chords: which chord and its voicing.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "361",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "edit1",
   "name": "EDIT 1",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "The engine's first four values (names change with the engine).",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "362",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "edit2",
   "name": "EDIT 2",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "The engine's next four values.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "363",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "lanes",
   "name": "LANES",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "DRUM engine only: levels of kick, snare, clap, closed hat.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "364",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "lanes2",
   "name": "LANES 2",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "DRUM engine only: levels of open hat, tom, rim, bell.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "365",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "slices",
   "name": "SLICES",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "SLICE engine only: place, split and join slices by hand.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "366",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L366"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "voice",
   "name": "VOICE",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "Poly/mono/legato/unison, glide, glide mode, note priority.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "372",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "voice2",
   "name": "VOICE 2",
   "how_to_get_there": "Press EDIT; press it again to step through its pages in order.",
   "what_it_is": "Voice allocation, detune, pan, mute.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "373",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "arp",
   "name": "ARP",
   "how_to_get_there": "Press ARP; press it again to step through its pages in order.",
   "what_it_is": "Arpeggiator mode, rate, octaves, gate.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "380",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "arp2",
   "name": "ARP 2",
   "how_to_get_there": "Press ARP; press it again to step through its pages in order.",
   "what_it_is": "Arpeggiator swing, probability, latch, note order.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "381",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "song",
   "name": "SONG",
   "how_to_get_there": "Hold SEQ about 0.7 seconds outside the pattern editing pages, or tap SEQ repeatedly to SONG.",
   "what_it_is": "Up to 16 sections repeat saved projects’ steps, pattern timing and compatible automation with the current sounds, excluding engine-specific automation from a different engine.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/song_chain.c",
     "lines": "26-40",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L26-L40"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/song_chain.c",
     "lines": "48-76",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L48-L76"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/project.c",
     "lines": "985-1026",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L985-L1026"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1332-1334",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1332-L1334"
    }
   ]
  },
  {
   "id": "user",
   "name": "USER",
   "how_to_get_there": "Press SAVE; press it again to step through its pages in order.",
   "what_it_is": "The 32 user slots keep a sound and a reduced sketch of its first 16 steps, without automation.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "377",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L377"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/upreset.c",
     "lines": "155-162",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L155-L162"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/upreset.c",
     "lines": "345-377",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L345-L377"
    }
   ]
  },
  {
   "id": "presets",
   "name": "PRESETS",
   "how_to_get_there": "From USER, press SAVE through PROJECT and TOOLS to PRESETS.",
   "what_it_is": "Browse factory and user sounds, with an optional favourites filter.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "376",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L376"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "phrases",
   "name": "PHRASES",
   "how_to_get_there": "Press SEQ repeatedly to PHRASES.",
   "what_it_is": "Load a factory pattern or a saved user preset's short pattern into the selected track.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "384",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L384"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "906-927",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L906-L927"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/upreset.c",
     "lines": "433-478",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L433-L478"
    }
   ]
  },
  {
   "id": "project",
   "name": "PROJECT",
   "how_to_get_there": "Press SAVE repeatedly to PROJECT.",
   "what_it_is": "The four project slots A-D have load and save actions.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "378",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L378"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "tools",
   "name": "TOOLS",
   "how_to_get_there": "Press SAVE; press it again to step through its pages in order.",
   "what_it_is": "Clear the sequence, init the sound, delete a song section, clear the song.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "379",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L379"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "automation",
   "name": "AUTO LIST",
   "how_to_get_there": "Press SEQ repeatedly to AUTO LIST, after AUTOMATION.",
   "what_it_is": "An editable list of the track's parameter locks and automation events, with 64 records shared between four tracks.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "389",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "step_roll",
   "name": "STEP (piano roll)",
   "how_to_get_there": "Press SEQ on a track whose engine is not DRUM.",
   "what_it_is": "The track's steps as a piano roll; the step cursor; step recording when the track is armed and stopped.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "382",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "step_grid",
   "name": "STEP (drum grid)",
   "how_to_get_there": "Press SEQ on a DRUM track.",
   "what_it_is": "A step grid: white keys are 16 steps of the shown page, black keys pick the drum lane.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "382",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui.c",
     "lines": "558-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
    }
   ]
  },
  {
   "id": "menu",
   "name": "MENU",
   "how_to_get_there": "Hold HOME about 0.7 seconds in the full Felucca layer.",
   "what_it_is": "Four tabs: DISPLAY, CONTROL, AUDIO and SYSTEM.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1230-1242",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1230-L1242"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/menu_items.c",
     "lines": "14-42",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
    }
   ]
  },
  {
   "id": "name",
   "name": "NAME",
   "how_to_get_there": "Opens when you save a user preset or a project (or press EDIT on USER/PROJECT to rename).",
   "what_it_is": "Type a name of up to 12 characters with the keys.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_name.c",
     "lines": "76-115",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L76-L115"
    }
   ]
  },
  {
   "id": "dialog",
   "name": "Confirm dialog",
   "how_to_get_there": "Appears before erasing a readable user slot, overwriting a readable occupied user or project slot, sound initialisation, TOOLS or AUTOMATION clear actions, song-section deletion, or loading over edited pattern steps.",
   "what_it_is": "OCT+ accepts on release and OCT− cancels; unreadable project slots skip the overwrite question, while project loads, EDIT step clears, REC clear, SEQ TOOLS and AUTO LIST edits act without it.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "831-852",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L852"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "861-889",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L889"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1037-1048",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1037-L1048"
    }
   ]
  },
  {
   "id": "layer_fx",
   "name": "FX layer",
   "how_to_get_there": "Hold FX (0.4 s by default; MENU > HOLD sets 0.3-0.6 s), or press a key or knob while holding it. Double-tap FX to keep it open without holding; tap FX again to close.",
   "what_it_is": "Performance effects on the white keys, track mutes on black keys 1-4, four macros on the knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "layer_glo",
   "name": "GLO layer",
   "how_to_get_there": "Hold GLO, or double tap GLO.",
   "what_it_is": "Mute and solo tracks, unmute them together, tap tempo or set the four levels.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "layer_scl",
   "name": "SEL layer",
   "how_to_get_there": "Hold SEL (0.4 s by default; MENU > HOLD sets 0.3-0.6 s), or press a key or knob while holding it. Double-tap SEL to keep it open without holding; tap SEL again to close.",
   "what_it_is": "A key sets the root; KNOB 1-4 are root, scale, chord, voicing.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "layer_edit",
   "name": "EDIT layer",
   "how_to_get_there": "Hold EDIT, or double tap it on a page where a tap opens its pages.",
   "what_it_is": "White keys choose engines or ask to initialise a sound; black keys do nothing.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "layer_seq",
   "name": "SEQ TOOLS layer",
   "how_to_get_there": "On STEP, PATTERN, CHANCE or AUTOMATION, hold SEQ or double tap it.",
   "what_it_is": "Sequence tools on white keys, drum lanes on black keys and length, division, swing and gate on the knobs.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "layer_rec",
   "name": "REC layer",
   "how_to_get_there": "Hold REC (0.4 s by default; MENU > HOLD sets 0.3-0.6 s), or press a key or knob while holding it. Double-tap REC to keep it open without holding; tap REC again to close.",
   "what_it_is": "Clear the track, click, count-in, click level.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "52-65",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_layer.c",
     "lines": "96-105",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
    }
   ]
  },
  {
   "id": "power_on",
   "name": "Power-on",
   "how_to_get_there": "Hold buttons while switching the FM-1 on.",
   "what_it_is": "Startup lights and the optional hardware control calibration before Rainbow begins.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/main.c",
     "lines": "269-278",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L269-L278"
    }
   ]
  },
  {
   "id": "global",
   "name": "GLOBAL",
   "how_to_get_there": "Press GLO from MIXER.",
   "what_it_is": "Tempo, swing, clock source and global tuning.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "374",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
    }
   ]
  },
  {
   "id": "system",
   "name": "SYSTEM",
   "how_to_get_there": "Press GLO from GLOBAL.",
   "what_it_is": "USB MIDI status, an unused sync card, MIDI routing and CPU load.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "375",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
    }
   ]
  },
  {
   "id": "pattern",
   "name": "PATTERN",
   "how_to_get_there": "Press SEQ repeatedly to PATTERN.",
   "what_it_is": "Pattern length, clock division, swing and gate.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "383",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
    }
   ]
  },
  {
   "id": "chance",
   "name": "CHANCE",
   "how_to_get_there": "Press SEQ repeatedly to CHANCE.",
   "what_it_is": "Step cursor, hit probability and ratchet count.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "387",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
    }
   ]
  },
  {
   "id": "motion",
   "name": "AUTOMATION",
   "how_to_get_there": "Press SEQ repeatedly to AUTOMATION.",
   "what_it_is": "Enable or disable the track's automation and locks, count records or clear them.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/params.c",
     "lines": "388",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L388"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "HARDWARE CALIBRATION",
   "how_to_get_there": "Hold OCT- and OCT+ at startup, or choose CALIBRATION on the SYSTEM menu tab and release OCT+.",
   "what_it_is": "Follow prompts to assign buttons and clockwise encoder directions; any music key or thirty seconds without input cancels and restores the previous assignments.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/main.c",
     "lines": "274-276",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L274-L276"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_menu.c",
     "lines": "459-463",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L459-L463"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1491-1551",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1491-L1551"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1464-1484",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1484"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/ui_input.c",
     "lines": "1546-1551",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
    }
   ]
  },
  {
   "id": "felucca",
   "name": "Full Felucca",
   "how_to_get_there": "From Rainbow, hold HOME and SAVE together for more than three seconds.",
   "what_it_is": "The four-track synth and sequencer after leaving the toy; restart the unit to return to Rainbow.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1751-1757",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1751-L1757"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "772-787",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L772-L787"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "415",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L415"
    }
   ]
  }
 ],
 "controls": {
  "button_fx": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles short repeated audio and a shaking friend, replacing any other top-row effect.",
    "short_label": "HICCUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens FX, SLICER, DLY, REVERB and CHORUS in order on successive releases.",
    "short_label": "EFFECTS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1028-1062",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1028-L1062"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355-359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355-L359"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens the FX performance layer while held.",
    "short_label": "PERFORM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps the FX layer open without holding; press FX again to close.",
    "short_label": "LOCK FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles reversed audio and a mirrored friend, replacing any other top-row effect.",
    "short_label": "BACKWARDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens SCL page, then CHORD; each further press goes to the next page of the group; acts when you let go.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1342-1386",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1342-L1386"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-596",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L596"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens the SEL layer: a key sets the root, knobs set root, scale, chord, voicing.",
    "short_label": "SET KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps the SEL layer open without holding; press SEL again to close.",
    "short_label": "LOCK SEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles a slowing sound and a drooping friend, clearing itself after three seconds, replacing any other top-row effect.",
    "short_label": "SLEEPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens ENV, then ENV DEST; each further press goes to the next page of the group; acts when you let go.",
    "short_label": "ENVELOPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1342-1386",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1342-L1386"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-596",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L596"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles an octave-up effect and a smaller friend, replacing any other top-row effect.",
    "short_label": "SQUEAKY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens LFO, LFO DEST and MOD in order on successive releases.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1028-1062",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1028-L1062"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352-354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352-L354"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles an octave-down effect and a larger friend, replacing any other top-row effect.",
    "short_label": "GIANT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens the engine controls, applicable lane or slice pages and VOICE pages in order on successive releases.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1028-1062",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1028-L1062"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362-373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362-L373"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "343-357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L343-L357"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens the EDIT layer while held, with engine choices on white keys and sound selection on its knobs.",
    "short_label": "PICK ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "509-515",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L509-L515"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps the EDIT layer open without holding; press EDIT again to close.",
    "short_label": "LOCK EDIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "Clears the selected step and advances immediately without a question or undo, except held note keys limit clearing to its locks with held-SAVE undo.",
    "short_label": "CLEAR STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1037-1048",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1037-L1048"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "653-667",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L653-L667"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "With grid steps held, clears only their parameter locks with a SAVE-held undo; with none held, clears every lane and lock at the cursor step and advances immediately without asking or undo, unless a song chain is active.",
    "short_label": "CLEAR LOCKS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "653-667",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L653-L667"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1037-1048",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1037-L1048"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "459-466",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L459-L466"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "press",
    "action": "Deletes the selected automation event or lock at once; holding SAVE restores it.",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "212-230",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L212-L230"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "press",
    "action": "Renames the selected slot (opens the NAME screen).",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1054-1057",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1054-L1057"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "press",
    "action": "Renames the selected slot (opens the NAME screen).",
    "short_label": "RENAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1054-1057",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1054-L1057"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles a frozen audio slice and an icy friend, replacing any other top-row effect.",
    "short_label": "FREEZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "289-292",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L289-L292"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "711-722",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L711-L722"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1746-1750",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1746-L1750"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "169-195",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L169-L195"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2076-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2076-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Leaves the tapped effect in its current on or off state.",
    "short_label": "KEEP EFFECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1633-1642",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1633-L1642"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens MIXER, then GLOBAL, then SYSTEM on successive releases.",
    "short_label": "MIX/GLOBAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1030-1035",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1030-L1035"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "581-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L581-L595"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens track mutes, solos, level controls and tap tempo while held.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-508",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L504-L508"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps the GLO layer open without holding; press GLO again to close.",
    "short_label": "LOCK GLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Starts or stops the selected accompaniment, using its drums and bass outside WRITE.",
    "short_label": "BEAT PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "633-693",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L633-L693"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1644-1668",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1644-L1668"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Replays the current question, or starts the pending next question if the last answer was already accepted.",
    "short_label": "HEAR NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1649-1655",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1649-L1655"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Replays the current memory pattern after a short pause.",
    "short_label": "HEAR PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1645-1647",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1645-L1647"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1400-1406",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1400-L1406"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Starts or stops LOFI practice with one chord per bar and a bass part following the lesson roots.",
    "short_label": "LOFI PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "670-693",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L670-L693"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1657-1667",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1657-L1667"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays the written song repeatedly from the beginning.",
    "short_label": "SONG PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1644-1668",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1644-L1668"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1106-1129",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1106-L1129"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Stops song playback so the keys can edit the current column again.",
    "short_label": "SONG STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1657-1659",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1657-L1659"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Starts or stops all four tracks; stops a count-in.",
    "short_label": "PLAY/STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1346-1356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1346-L1356"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Starts at section 1 or stops the song, using saved steps, pattern timing and compatible automation with the current sounds rather than loading saved sounds.",
    "short_label": "PLAY SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1346-1354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1346-L1354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/song_chain.c",
      "lines": "26-40",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L26-L40"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/song_chain.c",
      "lines": "48-76",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L48-L76"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "985-1026",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L985-L1026"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press",
    "action": "With GLO held or locked open and no song chain active, starts playback or restarts it instead of stopping; while playing to an external clock it refuses the restart, so close GLO to stop with PLAY.",
    "short_label": "RESTART",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "106-116",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L106-L116"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "175-186",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L175-L186"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "531-542",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L531-L542"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Stops transport that began from MIDI or the editor during NAME so saving can proceed, while a stopped transport stays stopped.",
    "short_label": "STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1262-1267",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1262-L1267"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Toggles SPARKLE, an up-and-down sixteenth-note arpeggio for held keys.",
    "short_label": "SPARKLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "565-566",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L565-L566"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1669-1676",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1669-L1676"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Cycles through SPARKLE TUNE, SPARKLE ALL and off, with drum friends using a simple on/off toggle.",
    "short_label": "SPARKLE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "567-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L567-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1669-1676",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1669-L1676"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1669-1671",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1669-L1671"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1669-1671",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1669-L1671"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens ARP, then ARP 2; each further press goes to the next page of the group; acts when you let go.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1342-1386",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1342-L1386"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-596",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L596"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Chooses the next of 20 accompaniments: DANCE, MARCH, SPOOKY, ROCK, DISCO, HIP HOP, TRAIN, SAMBA, REGGAE, LULLABY, HOEDOWN, LOFI, ACID, POLKA, BOSSA, FUNK, SKA, TRAP, SALSA and SHUFFLE.",
    "short_label": "NEXT BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "70-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L70-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1677-1706",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1677-L1706"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Chooses the next of 17 songs and starts its lesson again from the first note.",
    "short_label": "NEXT SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1283-1306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1283-L1306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1687-1693",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1687-L1693"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Chooses the next chord lesson and resets its position, updating the practice bass when it is in use.",
    "short_label": "NEXT LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1328-1359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1328-L1359"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1678-1685",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1678-L1685"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Cycles through no drums and 20 drum accompaniments, queuing the song for saving while stopped after four seconds without another marked song edit, although choices 16–20 do not reload as selected.",
    "short_label": "SONG BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1695-1704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1695-L1704"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1051-1086",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1086"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Cycles through no drums and 20 drum accompaniments, queuing the song for saving while stopped after four seconds without another marked song edit, although choices 16–20 do not reload as selected.",
    "short_label": "SONG BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1695-1704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1695-L1704"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1051-1086",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1086"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Cycles STEP, PATTERN, PHRASES, SONG, CHANCE, AUTOMATION and AUTO LIST on successive releases.",
    "short_label": "SEQUENCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1332-1337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1332-L1337"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382-389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382-L389"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens SEQ TOOLS while held on STEP, PATTERN, CHANCE or AUTOMATION.",
    "short_label": "SEQ TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-59",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L59"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps SEQ TOOLS open after a double tap on STEP, PATTERN, CHANCE or AUTOMATION.",
    "short_label": "LOCK TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "long_press",
    "action": "Outside STEP, PATTERN, CHANCE and AUTOMATION, hold about 0.7 seconds to open SONG.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1332-1337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1332-L1337"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "990-1001",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L990-L1001"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Moves to the next of 11 skies and adds confetti.",
    "short_label": "NEXT SKY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "68-69",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L68-L69"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1707-1717",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1707-L1717"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Arms the new-song hold without clearing notes yet.",
    "short_label": "CLEAR HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1707-1711",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1707-L1711"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "long_press",
    "action": "After more than two seconds, clears all 32 song columns without asking or undo, then saves after four seconds without another marked song edit while stopped or when WRITE is left.",
    "short_label": "NEW SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1272-1279",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1272-L1279"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1785-1795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1785-L1795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1138-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1138-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1227",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1227"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Cancels a new-song hold if it has not reached two seconds.",
    "short_label": "CANCEL CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1785-1787",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1785-L1787"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Arms the new-song hold without clearing notes yet.",
    "short_label": "CLEAR HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1707-1711",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1707-L1711"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "long_press",
    "action": "After more than two seconds, clears all 32 song columns without asking or undo, then saves after four seconds without another marked song edit while stopped or when WRITE is left.",
    "short_label": "NEW SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1272-1279",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1272-L1279"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1785-1795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1785-L1795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1138-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1138-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1227",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1227"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "release",
    "action": "Cancels a new-song hold if it has not reached two seconds.",
    "short_label": "CANCEL CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1785-1787",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1785-L1787"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Arms or disarms recording on the selected track; arming while stopped also starts playback (live recording).",
    "short_label": "REC ARM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "483-507",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L483-L507"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "Arms step recording: playback stays stopped and the keys write the cursor step.",
    "short_label": "STEP REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "479-507",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L479-L507"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "Does not arm; tells you to go to SEQ to record.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "490-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L490-L493"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "hold",
    "action": "Opens the REC layer: clear, click, count-in, click level.",
    "short_label": "REC SETUP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "double_press",
    "action": "Keeps the REC layer open without holding; press REC again to close.",
    "short_label": "LOCK REC",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "246-270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L246-L270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Opens WRITE and stops accompaniment; the current friend can replace the least-used song part without asking, saved tempo loads only on the first visit after power-on, and entry changes persist with a later marked edit.",
    "short_label": "WRITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1161-1219",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1161-L1219"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1236-1240",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1236-L1240"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1051-1058",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1058"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Leaves WRITE and queues any changed song for storage without asking or undo, stopping playback before the pending settings write can complete.",
    "short_label": "LEAVE WRITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1718-1726",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1718-L1726"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1241",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1241"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1138-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1138-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Leaves WRITE and queues any changed song for storage without asking or undo, stopping playback before the pending settings write can complete.",
    "short_label": "LEAVE WRITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1718-1726",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1718-L1726"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1241",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1241"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1138-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1138-L1145"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press_while_holding:button_home",
    "action": "Suppresses the WRITE toggle so the three-second HOME and SAVE hold can leave Rainbow.",
    "short_label": "FELUCCA HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1718-1720",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1718-L1720"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1750-1762",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1750-L1762"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press_with:button_home",
    "action": "Holding HOME and SAVE together for more than three seconds leaves Rainbow and tries to restore a readable Felucca autosave when RESTORE LAST is on, saving pending WRITE edits after playback stops.",
    "short_label": "FULL FELUCCA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1750-1762",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1750-L1762"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "772-788",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L772-L788"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1227",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1227"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Keeps the ten-position name without asking or undo and shows the greeting, queuing the setting to be written when playback is stopped.",
    "short_label": "KEEP NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "917-928",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L917-L928"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Opens USER; further releases cycle PROJECT, TOOLS, PRESETS and USER.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1272-1277",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1272-L1277"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-578",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L578"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "376-379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L376-L379"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "long_press",
    "action": "Held about 0.7 seconds, swaps the last supported sound, pattern or automation edit with its undo copy.",
    "short_label": "UNDO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1272-1277",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1272-L1277"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "618-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L618-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "780-798",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L780-L798"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press",
    "action": "Ignored while a layer's button is held (no undo, no page).",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1198-1201",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1198-L1201"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press_while_holding:button_home",
    "action": "Uses SAVE’s name-save action rather than checking the Rainbow exit timer while YOUR NAME is open.",
    "short_label": "KEEP NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "896-928",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L896-L928"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1605-1615",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1605-L1615"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Starts the short-press or one-second grown-ups hold.",
    "short_label": "HOME HOLD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1727-1731",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1727-L1731"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "After a short press, chooses a different surprise friend and adds confetti.",
    "short_label": "SURPRISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1775-1783",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1775-L1783"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "After a short press, erases both notes in the current song column without asking or undo and queues the changed song for saving.",
    "short_label": "CLEAR COLUMN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1775-1783",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1775-L1783"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "release",
    "action": "After a short press, erases both notes in the current song column without asking or undo and queues the changed song for saving.",
    "short_label": "CLEAR COLUMN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1775-1783",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1775-L1783"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "long_press",
    "action": "After one second without SAVE, opens VOLUME and cancels the short-release action.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1762-1774",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1762-L1774"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press_with:button_save",
    "action": "Holding HOME and SAVE together for more than three seconds leaves Rainbow and tries to restore a readable Felucca autosave when RESTORE LAST is on, saving pending WRITE edits after playback stops.",
    "short_label": "FULL FELUCCA",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1750-1762",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1750-L1762"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "772-788",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L772-L788"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1221-1227",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1227"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Closes YOUR NAME without storing the edits.",
    "short_label": "CANCEL NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "930-935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L930-L935"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Returns to the sound home screen when released.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1338-1339",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1338-L1339"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "598-605",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L598-L605"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "long_press",
    "action": "Held about 0.7 s: opens the MENU (or closes it).",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1233-1244",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1233-L1244"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "993-1008",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L993-L1008"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "Closes MENU and returns HOME, always requesting a whole-settings save without asking; writing waits until stopped and is skipped if the exported settings equal the loaded or last-saved copy.",
    "short_label": "CLOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "410-415",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1047",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1047"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press",
    "action": "Ignored while a layer's button is held (no menu, no HOME).",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1200-1201",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1200-L1201"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing while this layer's button is held; on a locked layer the press closes it and opens its usual page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1203",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1203"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1356-1379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1356-L1379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "171-185",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L171-L185"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Moves the friend one octave lower within two octaves each way and changes its size, also shifting drum assignments until another sound or knob change restores their normal octave.",
    "short_label": "BIGGER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "797-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L797-L806"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "590-591",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L590-L591"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Moves the selected song column back with wrapping across all 32 columns.",
    "short_label": "COLUMN BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Moves the selected song column back with wrapping across all 32 columns.",
    "short_label": "COLUMN BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     }
    ]
   },
   {
    "mode": "rainbow_volume",
    "gesture": "press_while_holding:button_home",
    "action": "Moves the maximum volume down one of eight steps and queues the setting to be written when playback is stopped, without asking or undo.",
    "short_label": "VOLUME DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "809-816",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L809-L816"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1735",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1735"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press_with:button_oct_up",
    "action": "Holding both octave buttons for more than five seconds enters USB boot mode without a confirmation or an extra save.",
    "short_label": "USB BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-331",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L331"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press_with:button_oct_up",
    "action": "Holding both octave buttons for more than five seconds enters USB boot mode without a confirmation or an extra save.",
    "short_label": "USB BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-331",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L331"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Shifts the keys down an octave (to -3).",
    "short_label": "OCT -",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1365-L1376"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press_with:button_oct_up",
    "action": "Both together: octave back to 0.",
    "short_label": "OCT RESET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1365-L1376"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press_with:button_oct_up",
    "action": "Held together for 5 s: enters update (boot) mode for installing firmware; a countdown shows from 2 s, letting go cancels.",
    "short_label": "UPDATE 5S",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-332",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L332"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_up",
    "action": "Holding both OCT buttons at startup runs control calibration and then requests a settings save without a question, even if calibration times out.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "274-276",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L274-L276"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1491-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1491-L1551"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1060",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1060"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "On release, returns HOME.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1393",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1393"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "press",
    "action": "On release, returns HOME.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1393",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1393"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1328-1329",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1328-L1329"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Drops the picked action, or goes back to HOME when none is picked (cancels a dialog); acts when you let go.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1395"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1322-1324",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1322-L1324"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "On release, selects the previous value, or returns from ABOUT to the settings tabs.",
    "short_label": "PREV/BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "435-458",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L435-L458"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Cancels: nothing is written.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "6",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L6"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "On release, restores the four tracks’ mute states and levels and the tempo captured when GLO opened, in memory without shifting octave.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "231-241",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L231-L241"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "595-601",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L595-L601"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "On release, restores the selected track’s root, scale, key quantization, transpose, chord and voicing captured when SEL opened, in memory without shifting octave.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "237-239",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L237-L239"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "602-607",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L602-L607"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/core.h",
      "lines": "52",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/core.h#L52"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "action": "After an EDIT sound load, releasing OCT− recalls its sound undo copy in memory without shifting octave; a full automation pool prevents the recall.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "326-343",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L326-L343"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "568-571",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L568-L571"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "780-814",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L780-L814"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "action": "On release, puts the track’s steps, automation, locks and pattern timing back to their layer-opening state in memory without shifting octave; a song chain blocks restoration after a tool edit, and a full automation pool can leave automation and locks unrestored.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "227-234",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L227-L234"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "572-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L572-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/motion.c",
      "lines": "287-307",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/motion.c#L287-L307"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "release",
    "action": "On release, restores the track’s steps, automation, locks and recording choices from when REC opened, in memory without shifting octave; a song chain blocks restoration after a clear, and a full automation pool can leave automation and locks unrestored.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "227-243",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L227-L243"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "572-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L572-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/motion.c",
      "lines": "287-307",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/motion.c#L287-L307"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "With MENU > FX LATCH on, releasing OCT− clears all latched effects and resets the four performance macros to off.",
    "short_label": "FX ALL OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "905-921",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L905-L921"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1173-1174",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1173-L1174"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "557-567",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L557-L567"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "press",
    "action": "On release, cancels the selected action or returns HOME.",
    "short_label": "BACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1387-1393",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1387-L1393"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Moves the friend one octave higher within two octaves each way and changes its size, also shifting drum assignments until another sound or knob change restores their normal octave.",
    "short_label": "OCT +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "797-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L797-L806"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "590-591",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L590-L591"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Moves the selected song column forward with wrapping across all 32 columns.",
    "short_label": "COLUMN NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Moves the selected song column forward with wrapping across all 32 columns.",
    "short_label": "COLUMN NEXT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1741",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
     }
    ]
   },
   {
    "mode": "rainbow_volume",
    "gesture": "press_while_holding:button_home",
    "action": "Moves the maximum volume up one of eight steps and queues the setting to be written when playback is stopped, without asking or undo.",
    "short_label": "VOLUME UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "809-816",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L809-L816"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1732-1735",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1735"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "914-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L914-L936"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press_with:button_oct_down",
    "action": "Holding both octave buttons for more than five seconds enters USB boot mode without a confirmation or an extra save.",
    "short_label": "USB BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-331",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L331"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press_with:button_oct_down",
    "action": "Holding both octave buttons for more than five seconds enters USB boot mode without a confirmation or an extra save.",
    "short_label": "USB BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-331",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L331"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Shifts the keys up an octave (to +3).",
    "short_label": "OCT +",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1365-L1376"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press_with:button_oct_down",
    "action": "Both together: octave back to 0.",
    "short_label": "OCT RESET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1365-1376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1365-L1376"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press_with:button_oct_down",
    "action": "Held together for 5 s: enters update (boot) mode for installing firmware; a countdown shows from 2 s, letting go cancels.",
    "short_label": "UPDATE 5S",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-332",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L332"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_down",
    "action": "Holding both OCT buttons at startup runs control calibration and then requests a settings save without a question, even if calibration times out.",
    "short_label": "CALIBRATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "274-276",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L274-L276"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1491-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1491-L1551"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1060",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1060"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "press",
    "action": "Does the picked action (or confirms the dialog); acts when you let go.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1278-1328",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1278-L1328"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "press",
    "action": "On release, loads a readable sound without asking, asks before erasing a readable used slot, or opens NAME for SAVE while stopped; only a readable occupied target gets an overwrite question.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-873",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L873"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "65-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L65-L73"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "press",
    "action": "On release, replaces this track's pattern, asking first when its existing steps were edited, with held-SAVE undo.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "846-852",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L846-L852"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "618-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L618-L629"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "press",
    "action": "On release, loads without a question or undo, or opens NAME for saving while stopped; only a readable occupied slot gets an overwrite question, and confirming the name writes immediately without undo.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "876-889",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L876-L889"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "726-738",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L726-L738"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "770-795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L770-L795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/storage.c",
      "lines": "188-196",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/storage.c#L188-L196"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "press",
    "action": "On release, asks before the chosen clear, initialisation or song deletion; only sequence clearing and sound initialisation have held-SAVE undo.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-839",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L839"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1295-1320",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1295-L1320"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "press",
    "action": "On release, starts the song at section 1 or stops it.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "841-844",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L841-L844"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/song_chain.c",
      "lines": "62-76",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L62-L76"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "985-1026",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L985-L1026"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "press",
    "action": "On release, adds a parameter lock or switches the selected record between LOCK and AUTO, without a question and with held-SAVE undo.",
    "short_label": "ADD/KIND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "172-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L172-L209"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Does the picked action (or confirms the dialog); acts when you let go.",
    "short_label": "DO IT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "854-858",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L854-L858"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "165-198",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L165-L198"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "press",
    "action": "On release, selects the next value or opens CALIBRATION or ABOUT.",
    "short_label": "NEXT/OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "451-468",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L451-L468"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "On release while stopped, immediately saves the chosen sound or project, or renames that slot, with no further question and no undo.",
    "short_label": "WRITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "206-236",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L206-L236"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "press",
    "action": "On release after CLEAR is selected, asks before clearing this track's automation and locks; holding SAVE restores them.",
    "short_label": "CLEAR AUTO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "822-825",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L822-L825"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1292-1294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1292-L1294"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Does nothing and keeps the current octave.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "556-611",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L556-L611"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "release",
    "action": "Does nothing and keeps the current octave.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "556-611",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L556-L611"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "release",
    "action": "Does nothing and keeps the current octave.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "556-611",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L556-L611"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "release",
    "action": "Does nothing and keeps the current octave.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "556-611",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L556-L611"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "release",
    "action": "Does nothing and keeps the current octave.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "556-611",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L556-L611"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Chooses the adjacent friend, its sound, its home sky and its preferred accompaniment with that beat’s tempo.",
    "short_label": "FRIEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "695-708",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L695-L708"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "633-693",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L633-L693"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1852-1863",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1852-L1863"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "turn",
    "action": "Chooses the friend for new notes, replacing the least-used of three existing friends when all places are occupied and changing the sound of that friend’s existing notes without asking or undo.",
    "short_label": "WRITE FRIEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1857-1859",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1857-L1859"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1161-1186",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1161-L1186"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "turn",
    "action": "Chooses the friend for new notes, replacing the least-used of three existing friends when all places are occupied and changing the sound of that friend’s existing notes without asking or undo.",
    "short_label": "WRITE FRIEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1857-1859",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1857-L1859"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1161-1186",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1161-L1186"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_look",
    "gesture": "turn_while_holding:button_home",
    "action": "After HOME has been held one second, left chooses stand-ins and right restores look-alikes, queuing any changed choice for storage when playback stops without asking or undo.",
    "short_label": "LOOK-ALIKES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "819-827",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L819-L827"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1852-1854",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1852-L1854"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Cycles the current position through a space and A–Z, moving one character for either turn direction.",
    "short_label": "LETTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "896-906",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L896-L906"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Browses sounds across the engines and used user slots, preserving steps and allowing held-SAVE undo.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1269-1274",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1269-L1274"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "618-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L618-L629"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Moves the step cursor (as KNOB 1).",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Moves the step cursor (as KNOB 1).",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Moves to another row (as KNOB 1).",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Picks the slot (as KNOB 1).",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Picks the pattern (as KNOB 1).",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Picks the slot (as KNOB 1).",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Picks the section (as KNOB 1).",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-987",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L987"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Does nothing here.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "985-986",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L985-L986"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Does nothing here.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "985-986",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L985-L986"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves through the rows of the menu tab.",
    "short_label": "MENU ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "447-448",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L447-L448"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-985",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L985"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-985",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L985"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "965-985",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L965-L985"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "On ABOUT, scrolls the credits.",
    "short_label": "CREDITS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "439-445",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L439-L445"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Steps through 1 FRIEND, 3 FRIENDS, STRUM, ACCORDION, GUESS, FOLLOW, CHORDS and COPY ME, stopping at either end and restarting game progress when selected.",
    "short_label": "KEYS MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "344-346",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L344-L346"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1465-1492",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1465-L1492"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1864-1871",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1871"
     }
    ]
   },
   {
    "mode": "rainbow_volume",
    "gesture": "turn_while_holding:button_home",
    "action": "After HOME has been held one second outside WRITE, opens YOUR NAME.",
    "short_label": "NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1864-1866",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1866"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-894",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L894"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "turn",
    "action": "Does nothing in WRITE, including while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1864-1871",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1871"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "turn",
    "action": "Does nothing in WRITE, including while HOME is held.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1864-1871",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1871"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Moves the cursor left or right through ten name positions without wrapping.",
    "short_label": "NAME CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "907-908",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L907-L908"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Selects the track (1-4) on every page; the ALGORITHM name is the stock firmware's; Felucca makes it the track knob.",
    "short_label": "TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1420-1421",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1420-L1421"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Moves between the menu's four tabs.",
    "short_label": "MENU TAB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "427-434",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L427-L434"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "31-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L31-L42"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Does nothing while the layer button is held or its layer is locked open.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1194-1209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1194-L1209"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Changes the tempo in five-BPM steps from 60 to 180, with SLOW, WALK or FAST shown briefly.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1872-1876",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1872-L1876"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2379-2383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2379-L2383"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "turn",
    "action": "Changes the song tempo in five-BPM steps from 60 to 180, but turning SELECT alone does not mark the song for storage.",
    "short_label": "SONG TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1872-1876",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1872-L1876"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1051-1066",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1066"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "turn",
    "action": "Changes the song tempo in five-BPM steps from 60 to 180, but turning SELECT alone does not mark the song for storage.",
    "short_label": "SONG TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1872-1876",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1872-L1876"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1051-1066",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1066"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "909-913",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L909-L913"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM unless BPM LOCK is on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1422-1431",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1422-L1431"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "119",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L119"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Sets tempo even when BPM LOCK is on.",
    "short_label": "TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1173-1177",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1173-L1177"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1422-1431",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1422-L1431"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Two detents move one octave and resize the friend within two octaves each way.",
    "short_label": "SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1877-1885",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1877-L1885"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "797-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L797-L806"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "turn",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1877-1885",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1877-L1885"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "turn",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1877-1885",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1877-L1885"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "909-913",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L909-L913"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Edits the selected sound's first main value, which depends on its engine.",
    "short_label": "MAIN 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1291-1297",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets level.",
    "short_label": "LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "447-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L447-L471"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets attack.",
    "short_label": "ATTACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "350",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets env>filter.",
    "short_label": "ENV>FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "351",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets rate.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets lfo>pitch.",
    "short_label": "LFO>PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "353",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Chooses which of the 4 matrix slots the other knobs edit.",
    "short_label": "MOD SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L806"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets distortion.",
    "short_label": "DISTORTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets slicer type.",
    "short_label": "SLICER TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
     }
    ]
   },
   {
    "mode": "dly",
    "gesture": "turn",
    "action": "Sets time.",
    "short_label": "TIME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Sets type.",
    "short_label": "TYPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Sets rate.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Sets root.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "360",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Sets chord.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "361",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
     }
    ]
   },
   {
    "mode": "edit1",
    "gesture": "turn",
    "action": "Sets engine value 1 (name depends on the engine).",
    "short_label": "ENGINE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
     }
    ]
   },
   {
    "mode": "edit2",
    "gesture": "turn",
    "action": "Sets engine value 5 (name depends on the engine).",
    "short_label": "ENGINE 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "363",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets kick level.",
    "short_label": "KICK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "364",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "lanes2",
    "gesture": "turn",
    "action": "Sets o.hat level.",
    "short_label": "O.HAT LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "365",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Sets marker.",
    "short_label": "MARKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "782-786",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L782-L786"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Sets poly/mono.",
    "short_label": "POLY/MONO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "372",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets allocation.",
    "short_label": "ALLOCATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets arp mode.",
    "short_label": "ARP MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "380",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "381",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses the song section, including the next empty row to add one.",
    "short_label": "SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "734-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L734-L753"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Sets slot.",
    "short_label": "SLOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "793-796",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L793-L796"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "788-792",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L788-L792"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Sets sound.",
    "short_label": "SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L376"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "767-778",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L767-L778"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Sets pattern.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "798-801",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L798-L801"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Sets the project slot.",
    "short_label": "SLOT A-D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "378",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L378"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "788-792",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L788-L792"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects clearing all steps and automation on the selected track; OCT+ asks first and held SAVE restores them.",
    "short_label": "CLEAR SEQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-839",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L839"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1307-1320",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1307-L1320"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "670-704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L670-L704"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "535-545",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L535-L545"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Sets row.",
    "short_label": "ROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "111-132",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L111-L132"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Edits the value in the same column of the page shown (the four cards on screen).",
    "short_label": "VALUE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1433-1460",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1433-L1460"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn_while_holding:key_f3",
    "action": "Only while step recording (track armed with REC, playback stopped): hold the keys of the note you are entering and turn the knob to lock that value to the cursor step; the value is the one this knob edits on the sound page you used last; not armed, the keys just play and the knob edits the whole sound.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "593-603",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L593-L603"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With one or more grid steps held: locks the matching value to those steps (parameter lock).",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "586-592",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L586-L592"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes the selected setting; its saved value is updated when the menu closes and playback is stopped.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "451-458",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L451-L458"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "410-415",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "FILTER macro: sweeps a low-pass (one way) or high-pass (the other).",
    "short_label": "FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "497-503",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L497-L503"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Track 1 level (recorded as on MIXER).",
    "short_label": "T1 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-509",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L504-L509"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Root note.",
    "short_label": "ROOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L63"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Steps to the next or previous engine.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "509-516",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L509-L516"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Pattern length (1-64 steps).",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "75-78",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L75-L78"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Click: OFF, while recording, or always.",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "516-518",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L516-L518"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "421",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L421"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Moves the text cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "19",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L19"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Sets tempo from 40 to 240 BPM.",
    "short_label": "BPM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "374",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "The value does not choose the input; the screen displays USB MIDI connection status.",
    "short_label": "MIDI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Sets the pattern length from 1 to 64 steps.",
    "short_label": "LENGTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "turn",
    "action": "Moves the step cursor.",
    "short_label": "CURSOR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "387",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Enables or disables automation and locks on this track.",
    "short_label": "AUTO PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "388",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L388"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Changes day through sunset to night in eight steps, darkening the picture and filtering the sound.",
    "short_label": "DAY / NIGHT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1886-1895",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1886-L1895"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-549",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L549"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2377",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2377"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "909-913",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L909-L913"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Edits the selected sound's second main value, which depends on its engine.",
    "short_label": "MAIN 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1291-1297",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "447-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L447-L471"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets decay.",
    "short_label": "DECAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "350",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets env>pitch.",
    "short_label": "ENV>PITCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "351",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets wave.",
    "short_label": "WAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets lfo>filter.",
    "short_label": "LFO>FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "353",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Sets source.",
    "short_label": "SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L806"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets chorus send.",
    "short_label": "CHORUS SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets pattern.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
     }
    ]
   },
   {
    "mode": "dly",
    "gesture": "turn",
    "action": "Sets feedback.",
    "short_label": "FEEDBACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Sets size.",
    "short_label": "SIZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Sets depth.",
    "short_label": "DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Sets scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "360",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Sets voicing.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "361",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
     }
    ]
   },
   {
    "mode": "edit1",
    "gesture": "turn",
    "action": "Sets engine 2.",
    "short_label": "ENGINE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
     }
    ]
   },
   {
    "mode": "edit2",
    "gesture": "turn",
    "action": "Sets engine 6.",
    "short_label": "ENGINE 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "363",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets snare level.",
    "short_label": "SNARE LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "364",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "lanes2",
    "gesture": "turn",
    "action": "Sets tom level.",
    "short_label": "TOM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "365",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Sets move marker.",
    "short_label": "MOVE MARKER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "782-786",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L782-L786"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Sets glide.",
    "short_label": "GLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "372",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets detune.",
    "short_label": "DETUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets arp rate.",
    "short_label": "ARP RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "380",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets probability.",
    "short_label": "PROBABILITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "381",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Chooses project A-D for the section, creating a section if needed.",
    "short_label": "PROJECT A-D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "734-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L734-L753"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects loading this slot's sound with OCT+; current steps stay and held SAVE restores the previous sound.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-867",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L867"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "392-430",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L392-L430"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Sets engine.",
    "short_label": "ENGINE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L376"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "767-778",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L767-L778"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Picks LOAD (OCT+ does it).",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "798-801",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L798-L801"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "378",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L378"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-809",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L809"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects sound initialisation; OCT+ asks before replacing the sound with its first preset, keeping the steps.",
    "short_label": "INIT SOUND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-839",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L839"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1305-1306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1305-L1306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "618-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L618-L629"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Transposes the cursor step (an empty step gets the last note).",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "670-704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L670-L704"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Sets drum lane.",
    "short_label": "DRUM LANE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "535-545",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L535-L545"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Sets step.",
    "short_label": "STEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "125-152",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L125-L152"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Edits the value in the same column of the page shown (the four cards on screen).",
    "short_label": "VALUE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1433-1460",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1433-L1460"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn_while_holding:key_f3",
    "action": "Only while step recording (track armed with REC, playback stopped): hold the keys of the note you are entering and turn the knob to lock that value to the cursor step; the value is the one this knob edits on the sound page you used last; not armed, the keys just play and the knob edits the whole sound.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "593-603",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L593-L603"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With one or more grid steps held: locks the matching value to those steps (parameter lock).",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "586-592",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L586-L592"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes the selected setting; its saved value is updated when the menu closes and playback is stopped.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "451-458",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L451-L458"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "410-415",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "CRUSH macro.",
    "short_label": "CRUSH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "497-503",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L497-L503"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "21-27",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L21-L27"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Track 2 level (recorded as on MIXER).",
    "short_label": "T2 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-509",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L504-L509"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Scale.",
    "short_label": "SCALE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L63"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Steps through the engine's sounds.",
    "short_label": "SOUND NO.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "509-516",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L509-L516"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Step division (4 bars to 1/32).",
    "short_label": "DIVISION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "75-78",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L75-L78"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Count-in: OFF, 1 bar, 2 bars.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "516-518",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L516-L518"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "421",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L421"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Changes the character at the cursor.",
    "short_label": "CHARACTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "19",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L19"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Sets global swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "374",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Sets the step clock division.",
    "short_label": "DIVISION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "turn",
    "action": "Sets this step's hit probability from 0 to 100 percent.",
    "short_label": "CHANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "387",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Does nothing; its card shows the record count.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "388",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L388"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Changes echo through eight steps, adding delayed friend pictures and more delay and reverb to the playing friend.",
    "short_label": "ECHO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1896-1901",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1896-L1901"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "554-555",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L554-L555"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2090-2097",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2090-L2097"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "turn",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1896-1901",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1896-L1901"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "turn",
    "action": "Does nothing in WRITE.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1896-1901",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1896-L1901"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "909-913",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L909-L913"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Edits the selected sound's third main value, which depends on its engine.",
    "short_label": "MAIN 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1291-1297",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "447-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L447-L471"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets sustain.",
    "short_label": "SUSTAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "350",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Sets env>shape.",
    "short_label": "ENV>SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "351",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets phase.",
    "short_label": "PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets lfo>shape.",
    "short_label": "LFO>SHAPE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "353",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Sets destination.",
    "short_label": "DESTINATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L806"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets delay send.",
    "short_label": "DELAY SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets rate.",
    "short_label": "RATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
     }
    ]
   },
   {
    "mode": "dly",
    "gesture": "turn",
    "action": "Sets colour.",
    "short_label": "COLOUR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Sets damp.",
    "short_label": "DAMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Sets how notes follow the scale: OFF, SNAP, WHITE or SEQ.",
    "short_label": "KEY MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "14-16",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L14-L16"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "360",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "361",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
     }
    ]
   },
   {
    "mode": "edit1",
    "gesture": "turn",
    "action": "Sets engine 3.",
    "short_label": "ENGINE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
     }
    ]
   },
   {
    "mode": "edit2",
    "gesture": "turn",
    "action": "Sets engine 7.",
    "short_label": "ENGINE 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "363",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets clap level.",
    "short_label": "CLAP LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "364",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "lanes2",
    "gesture": "turn",
    "action": "Sets rim level.",
    "short_label": "RIM LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "365",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Picks SPLIT (OCT+ does it).",
    "short_label": "SPLIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "782-786",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L782-L786"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Sets glide mode.",
    "short_label": "GLIDE MODE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "372",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets pan.",
    "short_label": "PAN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets arp octaves.",
    "short_label": "ARP OCTAVES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "380",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets latch.",
    "short_label": "LATCH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "381",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Sets how many times that section plays, from 1 to 16.",
    "short_label": "REPEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "734-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L734-L753"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects erasing this user slot; stopped OCT+ asks first, then removes its sound and saved short pattern immediately with no undo.",
    "short_label": "ERASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-867",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L867"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1285-1288",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1285-L1288"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "510-530",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L510-L530"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Marks or unmarks the current sound as a favourite and requests a settings save.",
    "short_label": "FAVOURITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "767-778",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L767-L778"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "798-801",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L798-L801"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Selects immediate project loading with OCT+, replacing current music without a question or undo, even during playback.",
    "short_label": "LOAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "876-881",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L876-L881"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "860-898",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L860-L898"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "924-932",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L924-L932"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects deleting the current song section; OCT+ asks first and the deletion has no undo.",
    "short_label": "DEL SECTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-839",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L839"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1295-1301",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1295-L1301"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Chooses NOTE, TIE or REST for the cursor step.",
    "short_label": "NOTE/TIE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "670-704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L670-L704"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Adds or removes the selected lane's hit on the cursor step.",
    "short_label": "HIT ON/OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "535-545",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L535-L545"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Sets the record's parameter.",
    "short_label": "PARAMETER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "153-161",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L153-L161"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Edits the value in the same column of the page shown (the four cards on screen).",
    "short_label": "VALUE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1433-1460",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1433-L1460"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn_while_holding:key_f3",
    "action": "Only while step recording (track armed with REC, playback stopped): hold the keys of the note you are entering and turn the knob to lock that value to the cursor step; the value is the one this knob edits on the sound page you used last; not armed, the keys just play and the knob edits the whole sound.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "593-603",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L593-L603"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With one or more grid steps held: locks the matching value to those steps (parameter lock).",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "586-592",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L586-L592"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes the selected setting; its saved value is updated when the menu closes and playback is stopped.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "451-458",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L451-L458"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "410-415",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "THROW macro: sends the dry mix into delay and reverb.",
    "short_label": "THROW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "497-503",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L497-L503"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "21-27",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L21-L27"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Track 3 level (recorded as on MIXER).",
    "short_label": "T3 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-509",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L504-L509"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Chord type of the one-finger chord keys.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L63"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Marks or unmarks the sound as a favourite.",
    "short_label": "FAVOURITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "509-516",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L509-L516"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "75-78",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L75-L78"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Click level: low, mid, high.",
    "short_label": "CLICK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "516-518",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L516-L518"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "421",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L421"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on this screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "266-269",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L266-L269"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Chooses internal, USB or TRS MIDI clock.",
    "short_label": "CLOCK SOURCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "374",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "Chooses channels 1-4 for tracks 1-4, or sends all channels to the selected track.",
    "short_label": "ROUTING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Sets the track's swing.",
    "short_label": "SWING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "turn",
    "action": "Sets this step to one, two, three or four hits.",
    "short_label": "RATCHET",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "387",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "388",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L388"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "The source consumes the turn before the WIGGLE branch, so an ordinary FM-1 turn makes no WIGGLE change.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1902-1912",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1902-L1912"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/panel.c",
      "lines": "85-91",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/panel.c#L85-L91"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/hal/fm1_input.h",
      "lines": "587-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/hal/fm1_input.h#L587-L595"
     }
    ]
   },
   {
    "mode": "rainbow_hat",
    "gesture": "turn_while_holding:button_home",
    "action": "After HOME has been held one second, cycles ten hats and none, queuing each choice to be written when playback is stopped without asking or undo.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "938-951",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L938-L951"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1902-1906",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1902-L1906"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "1029-1061",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1061"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Does nothing on YOUR NAME.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "909-913",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L909-L913"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "turn",
    "action": "Edits the selected sound's fourth main value, which depends on its engine.",
    "short_label": "MAIN 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1291-1297",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "turn",
    "action": "Sets mute.",
    "short_label": "MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "447-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L447-L471"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "turn",
    "action": "Sets release.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "350",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "351",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-809",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L809"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "turn",
    "action": "Sets fade.",
    "short_label": "FADE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "turn",
    "action": "Sets lfo>amp.",
    "short_label": "LFO>AMP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "353",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "turn",
    "action": "Sets amount.",
    "short_label": "AMOUNT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-806",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L806"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "turn",
    "action": "Sets reverb send.",
    "short_label": "REVERB SEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "turn",
    "action": "Sets depth.",
    "short_label": "DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
     }
    ]
   },
   {
    "mode": "dly",
    "gesture": "turn",
    "action": "Sets mix.",
    "short_label": "MIX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "803-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L803-L812"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "turn",
    "action": "Sets transpose.",
    "short_label": "TRANSPOSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "360",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "361",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
     }
    ]
   },
   {
    "mode": "edit1",
    "gesture": "turn",
    "action": "Sets engine 4.",
    "short_label": "ENGINE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
     }
    ]
   },
   {
    "mode": "edit2",
    "gesture": "turn",
    "action": "Sets engine 8.",
    "short_label": "ENGINE 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "363",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "turn",
    "action": "Sets c.hat level.",
    "short_label": "C.HAT LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "364",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "lanes2",
    "gesture": "turn",
    "action": "Sets bell level.",
    "short_label": "BELL LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "365",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "turn",
    "action": "Picks JOIN (OCT+ does it).",
    "short_label": "JOIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "788-791",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L788-L791"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "854-859",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L854-L859"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "155-156",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L155-L156"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "182-187",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L182-L187"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "turn",
    "action": "Sets priority.",
    "short_label": "PRIORITY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "372",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "turn",
    "action": "Sets mute.",
    "short_label": "MUTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "turn",
    "action": "Sets arp gate.",
    "short_label": "ARP GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "380",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "turn",
    "action": "Sets note order.",
    "short_label": "NOTE ORDER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "381",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "734-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L734-L753"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "turn",
    "action": "Selects saving the sound and a reduced 16-step sketch without automation; stopped OCT+ asks only before replacing a readable occupied user slot, otherwise opens NAME directly, and name confirmation writes immediately without undo.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-873",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L873"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "206-236",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L206-L236"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "155-162",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L155-L162"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "345-377",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L345-L377"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-873",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L873"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "turn",
    "action": "Switches between all sounds and favourites, requesting a settings save.",
    "short_label": "LIST FILTER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "767-778",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L767-L778"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "turn",
    "action": "Nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "798-801",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L798-L801"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1322-1344",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1322-L1344"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "turn",
    "action": "Selects a project save while stopped; OCT+ asks only before replacing a readable project, unreadable slots go straight to NAME, and confirming the name writes all tracks and the song immediately without undo.",
    "short_label": "SAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "876-889",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L876-L889"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "726-738",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L726-L738"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "770-795",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L770-L795"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/storage.c",
      "lines": "188-196",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/storage.c#L188-L196"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "turn",
    "action": "Selects clearing the entire song arrangement; OCT+ asks first and clearing has no undo.",
    "short_label": "CLEAR SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-839",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L839"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1303-1304",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1303-L1304"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn",
    "action": "Sets accent, slide, both or none.",
    "short_label": "ACC/SLIDE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "670-704",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L670-L704"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn",
    "action": "Sets accent.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "535-545",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L535-L545"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "turn",
    "action": "Sets the record's value.",
    "short_label": "VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_events.c",
      "lines": "162-169",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_events.c#L162-L169"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Edits the value in the same column of the page shown (the four cards on screen).",
    "short_label": "VALUE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1433-1460",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1433-L1460"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "turn_while_holding:key_f3",
    "action": "Only while step recording (track armed with REC, playback stopped): hold the keys of the note you are entering and turn the knob to lock that value to the cursor step; the value is the one this knob edits on the sound page you used last; not armed, the keys just play and the knob edits the whole sound.",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "593-603",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L593-L603"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "turn_while_holding:key_f3",
    "action": "With one or more grid steps held: locks the matching value to those steps (parameter lock).",
    "short_label": "LOCK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1439-1443",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1439-L1443"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "586-592",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L586-L592"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "turn",
    "action": "Changes the selected setting; its saved value is updated when the menu closes and playback is stopped.",
    "short_label": "MENU VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "451-458",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L451-L458"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "410-415",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "turn_while_holding:button_fx",
    "action": "DEPTH macro: how loud the held repeat, reverse, tape, freeze, flanger and phaser effects are; while the OCT UP or OCT DOWN harmoniser key (G4, A4) is held, it sets their shimmer instead.",
    "short_label": "DEPTH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "16",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L16"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "turn_while_holding:button_glo",
    "action": "Track 4 level (recorded as on MIXER).",
    "short_label": "T4 LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "504-509",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L504-L509"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "turn_while_holding:button_sel",
    "action": "Chord voicing.",
    "short_label": "VOICING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L63"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "turn_while_holding:button_edit",
    "action": "Nothing.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "509-516",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L509-L516"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "turn_while_holding:button_seq",
    "action": "Gate length.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "75-78",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L75-L78"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "turn",
    "action": "Does nothing on this screen.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "266-269",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L266-L269"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "turn",
    "action": "Sets global tuning from -50 to +50 cents.",
    "short_label": "TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "374",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "turn",
    "action": "Does nothing; the card shows CPU load.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "turn",
    "action": "Sets the track's gate length.",
    "short_label": "GATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "807-812",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L807-L812"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "turn",
    "action": "Does nothing on this page.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "387",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "706-753",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L706-L753"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "turn",
    "action": "Selects automation clearing; OCT+ asks before clearing this track's automation and locks, with one undo.",
    "short_label": "CLEAR AUTO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "822-825",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L822-L825"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1292-1294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1292-L1294"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "turn_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "516-518",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L516-L518"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "rainbow_play",
    "gesture": "turn",
    "action": "Changes output volume up to the grown-ups maximum, initially step six of eight, while the limiter follows the selected volume; Rainbow also applies fixed treble softening of about 4 dB above 3.3 kHz.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "725-749",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L725-L749"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "751-754",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L751-L754"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/fx.c",
      "lines": "107-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/fx.c#L107-L114"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/fx.c",
      "lines": "153-159",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/fx.c#L153-L159"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "turn",
    "action": "Changes output volume up to the grown-ups maximum, initially step six of eight, while the limiter follows the selected volume.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "725-749",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L725-L749"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "turn",
    "action": "Master volume (speaker and headphones; USB audio too unless MENU > USB LEVEL is FIXED; also the click).",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/master.c",
      "lines": "3-6",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/master.c#L3-L6"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 1 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays F3 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 1 of the shown page (steps 1, 17, 33, 49 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies RPT 1/8 to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "RPT 1/8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 1 while held.",
    "short_label": "SOLO T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses ANALOG with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "ANALOG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Clears the steps within the current pattern length; one undo (hold SAVE).",
    "short_label": "CLEAR STEPS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "350-354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L350-L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Clears the track's steps and automation at once (one undo, no dialog).",
    "short_label": "CLEAR TRACK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "395-444",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L395-L444"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "472-474",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L472-L474"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types AB phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE AB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Ends the solo made by this key and restores the other tracks' existing mute settings.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "51",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L51"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F#3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F#3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses F for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the F chord while held, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F#3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F#3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F#3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F#3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F#3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F#3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 1 (KICK) and plays it.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Mutes track 1 while held, or toggles that performance mute with FX LATCH, without saving its track mute setting.",
    "short_label": "FX MUTE T1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 1 (stays).",
    "short_label": "TRACK MUTE 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 1 (KICK) for the lane tools.",
    "short_label": "KICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the text cursor left.",
    "short_label": "CURSOR <",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays G3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from G3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 2 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays G3 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with G3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays G3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays G3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays G3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays G3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key G3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "G3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 2 of the shown page (steps 2, 18, 34, 50 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies RPT 1/16 to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "RPT 1/16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 2 while held.",
    "short_label": "SOLO T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses FM6 with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "FM6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Reverses steps within the current pattern length; one undo (hold SAVE).",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L355"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Click: next value (OFF, while recording, always).",
    "short_label": "CLICK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "395-444",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L395-L444"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "472-474",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L472-L474"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types CD phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE CD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Ends the solo made by this key and restores the other tracks' existing mute settings.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "51",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L51"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays G#3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from G#3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses G for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the G chord while held, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with G#3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays G#3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays G#3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays G#3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays G#3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key G#3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "G#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 2 (SNARE) and plays it.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Mutes track 2 while held, or toggles that performance mute with FX LATCH, without saving its track mute setting.",
    "short_label": "FX MUTE T2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 2 (stays).",
    "short_label": "TRACK MUTE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to G#.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 2 (SNARE) for the lane tools.",
    "short_label": "SNARE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays A3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from A3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 3 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays A3 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with A3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays A3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays A3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays A3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays A3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key A3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "A3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 3 of the shown page (steps 3, 19, 35, 51 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies RPT 1/32 to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "RPT 1/32",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 3 while held.",
    "short_label": "SOLO T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to A.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses PHASE with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "PHASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Shifts steps within the current pattern length one step left; one undo (hold SAVE).",
    "short_label": "SHIFT <",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L356"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Count-in: next value (OFF, 1 bar, 2 bars).",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "395-444",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L395-L444"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "472-474",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L472-L474"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types EF phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE EF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Ends the solo made by this key and restores the other tracks' existing mute settings.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "51",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L51"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays A#3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from A#3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses A minor for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the A minor chord while held, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with A#3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays A#3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays A#3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays A#3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays A#3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key A#3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "A#3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 3 (CLAP) and plays it.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Mutes track 3 while held, or toggles that performance mute with FX LATCH, without saving its track mute setting.",
    "short_label": "FX MUTE T3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 3 (stays).",
    "short_label": "TRACK MUTE 3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to A#.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 3 (CLAP) for the lane tools.",
    "short_label": "CLAP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the text cursor right.",
    "short_label": "CURSOR >",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays B3 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from B3, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 4 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays B3 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with B3, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays B3 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays B3 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays B3 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays B3 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key B3, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "B3",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 4 of the shown page (steps 4, 20, 36, 52 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies REVERSE to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "REVERSE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Solos track 4 while held.",
    "short_label": "SOLO T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to B.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses LOFI with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "LOFI",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Shifts steps within the current pattern length one step right; one undo (hold SAVE).",
    "short_label": "SHIFT >",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L357"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Click level: next value (low, mid, high).",
    "short_label": "CLICK LEVEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "395-444",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L395-L444"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "472-474",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L472-L474"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types GH phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE GH",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "release",
    "action": "Ends the solo made by this key and restores the other tracks' existing mute settings.",
    "short_label": "SOLO END",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "51",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L51"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays C4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from C4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 5 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays C4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with C4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays C4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays C4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays C4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays C4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key C4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "C4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 5 of the shown page (steps 5, 21, 37, 53 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies LPF to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "LPF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Unmutes all tracks.",
    "short_label": "UNMUTE ALL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to C.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses SAMPLE with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "SAMPLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Random: a fresh drum pattern on a DRUM track; on other tracks, the rhythm stays and the notes are re-picked from the scale; one undo (hold SAVE).",
    "short_label": "RANDOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "358-368",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L358-L368"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types IJK phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE IJK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays C#4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from C#4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses C for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the C chord while held, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with C#4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays C#4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays C#4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays C#4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays C#4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key C#4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "C#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 4 (C.HAT) and plays it.",
    "short_label": "C.HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Mutes track 4 while held, or toggles that performance mute with FX LATCH, without saving its track mute setting.",
    "short_label": "FX MUTE T4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Mutes or unmutes track 4 (stays).",
    "short_label": "TRACK MUTE 4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to C#.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 4 (C.HAT) for the lane tools.",
    "short_label": "C.HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor (held: repeats).",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays D4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from D4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 6 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays D4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with D4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays D4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays D4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays D4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays D4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key D4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "D4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 6 of the shown page (steps 6, 22, 38, 54 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 6",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies HPF to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "HPF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to D.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses VOICE with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Changes the pattern a little each press; one undo (hold SAVE).",
    "short_label": "COOK",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "370-375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types LM phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE LM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays D#4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from D#4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses D minor for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the D minor chord while held, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with D#4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays D#4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays D#4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays D#4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays D#4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key D#4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "D#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 5 (O.HAT) and plays it.",
    "short_label": "O.HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to D#.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 5 (O.HAT) for the lane tools.",
    "short_label": "O.HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches letters and numbers.",
    "short_label": "ABC/123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays E4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from E4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 7 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays E4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with E4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays E4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays E4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays E4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays E4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key E4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "E4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 7 of the shown page (steps 7, 23, 39, 55 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 7",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies TAPE STOP to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "TAPE STOP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to E.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses TRIO with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "TRIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM tracks: replaces the steps with one fixed basic beat (kick every 4th step, snare on 5 and 13, closed hat every 2nd); one undo (hold SAVE).",
    "short_label": "BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "377-384",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L377-L384"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types NO phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE NO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 8 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays F4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 8 of the shown page (steps 8, 24, 40, 56 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 8",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies FREEZE to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "FREEZE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Tap tempo: from the third tap, the tempo follows your taps (internal clock only).",
    "short_label": "TAP TEMPO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-462",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L462"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "482-493",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L482-L493"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses WHEEL with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "WHEEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L14-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types PQ phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE PQ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F#4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F#4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses F for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the Fmaj9 chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F#4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F#4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F#4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F#4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F#4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F#4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 6 (TOM) and plays it.",
    "short_label": "TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 6 (TOM) for the lane tools.",
    "short_label": "TOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the text cursor left.",
    "short_label": "CURSOR <",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays G4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from G4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 9 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays G4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with G4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays G4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays G4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays G4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays G4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key G4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "G4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 9 of the shown page (steps 9, 25, 41, 57 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 9",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies OCT UP to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "OCT UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses GRAIN with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "GRAIN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: clears the selected lane; one undo (hold SAVE).",
    "short_label": "LANE CLEAR",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "388-390",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L388-L390"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types RS phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE RS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays G#4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from G#4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses G for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the G9 chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with G#4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays G#4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays G#4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays G#4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays G#4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key G#4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "G#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 7 (RIM) and plays it.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to G#.",
    "short_label": "ROOT G#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 7 (RIM) for the lane tools.",
    "short_label": "RIM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types a space.",
    "short_label": "SPACE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays A4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from A4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 10 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays A4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with A4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays A4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays A4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays A4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays A4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key A4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "A4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 10 of the shown page (steps 10, 26, 42, 58 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 10",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Applies OCT DOWN to the master while held, or toggles it when FX LATCH is on.",
    "short_label": "OCT DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "29-35",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L29-L35"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to A.",
    "short_label": "ROOT A",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses PHYS with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "PHYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: reverses the selected lane; one undo (hold SAVE).",
    "short_label": "LANE REV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "391-398",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L391-L398"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types TU phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE TU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "release",
    "action": "Ends this performance effect or mute unless FX LATCH keeps it on.",
    "short_label": "FX RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/perform.c",
      "lines": "117-137",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/perform.c#L117-L137"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "773-776",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L773-L776"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays A#4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from A#4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses A minor for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the Am9 chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with A#4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays A#4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays A#4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays A#4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays A#4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key A#4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "A#4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Selects drum lane 8 (BELL) and plays it.",
    "short_label": "BELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to A#.",
    "short_label": "ROOT A#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: selects lane 8 (BELL) for the lane tools.",
    "short_label": "BELL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "475-479",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L475-L479"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "3-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L3-L25"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "113-115",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L113-L115"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "113-114",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L113-L114"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the text cursor right.",
    "short_label": "CURSOR >",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays B4 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from B4, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 11 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays B4 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with B4, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays B4 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays B4 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays B4 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays B4 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key B4, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "B4",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 11 of the shown page (steps 11, 27, 43, 59 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 11",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to B.",
    "short_label": "ROOT B",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses NOISE with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "NOISE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: fills the selected lane; each press steps through every step, every 2nd, every 4th, then empty; one undo (hold SAVE).",
    "short_label": "LANE FILL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "399-401",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L399-L401"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types VW phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE VW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays C5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from C5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 12 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays C5 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with C5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays C5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays C5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays C5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays C5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key C5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "C5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 12 of the shown page (steps 12, 28, 44, 60 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 12",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to C.",
    "short_label": "ROOT C",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses SLICE with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "DRUM: randomises the selected lane; one undo (hold SAVE).",
    "short_label": "LANE RANDOM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "369-391",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L369-L391"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "335-348",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L335-L348"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "402-404",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L402-L404"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "410-411",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L410-L411"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types XYZ phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE XYZ",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays C#5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from C#5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses C for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the Cmaj9 chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with C#5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays C#5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays C#5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays C#5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays C#5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key C#5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "C#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "hold",
    "action": "ACC: while held, the white step keys set or clear accents instead of hits.",
    "short_label": "ACCENT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "553-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L553-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to C#.",
    "short_label": "ROOT C#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Deletes the character before the cursor (held: repeats).",
    "short_label": "DELETE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays D5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from D5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 13 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays D5 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with D5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays D5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays D5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays D5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays D5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key D5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "D5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 13 of the shown page (steps 13, 29, 45, 61 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 13",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to D.",
    "short_label": "ROOT D",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Chooses DRUM with its first sound and keeps the steps, while choosing the current engine again leaves its sound as it is.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "329-342",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L329-L342"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L14-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 123 phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE 123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays D#5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from D#5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses D minor for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the Dm9 chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with D#5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays D#5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays D#5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays D#5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays D#5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key D#5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "D#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Previous page of 16 steps.",
    "short_label": "PAGE <",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to D#.",
    "short_label": "ROOT D#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Switches letters and numbers.",
    "short_label": "ABC/123",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays E5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from E5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 14 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays E5 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with E5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays E5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays E5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays E5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays E5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key E5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "E5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 14 of the shown page (steps 14, 30, 46, 62 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 14",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to E.",
    "short_label": "ROOT E",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "INIT: the engine's first sound (asks first).",
    "short_label": "INIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/engines.c",
      "lines": "74-94",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L74-L94"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_tools.c",
      "lines": "14-25",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_tools.c#L14-L25"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 456 phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE 456",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 15 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays F5 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 15 of the shown page (steps 15, 31, 47, 63 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 15",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F.",
    "short_label": "ROOT F",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "465-471",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L465-L471"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 789 phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE 789",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays F#5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from F#5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Chooses F for strumming and sounds its low root, with drum friends retaining their drum mapping.",
    "short_label": "STRUM CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays the F–B–E–A chord while held with the highest note omitted on PHYS and GRAIN, with drum friends retaining their drum mapping.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "582-594",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L582-L594"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with F#5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays F#5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays F#5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays F#5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays F#5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key F#5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "F#5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: silent; with SNAP, SEQ or SEQ+T: plays, rounded down into the scale.",
    "short_label": "SILENT(WHT)",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Next page of 16 steps.",
    "short_label": "PAGE >",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to F#.",
    "short_label": "ROOT F#",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Moves the text cursor left.",
    "short_label": "CURSOR <",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L574"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "rainbow_one",
    "gesture": "press",
    "action": "Plays G5 in the selected friend’s sound, adjusted by the octave setting.",
    "short_label": "NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "546-590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L546-L590"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "press",
    "action": "Builds a C-major scale triad from G5, taking the scale note below a black key, while drum friends keep one drum per key.",
    "short_label": "TRIAD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-563",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L563"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "43-71",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L43-L71"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "77-99",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L77-L99"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "press",
    "action": "Plays note 16 of the selected chord’s ascending strum, with drum friends retaining their drum mapping.",
    "short_label": "STRUM NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "94-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L94-L124"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "press",
    "action": "Plays G5 as the tune above black-key chords, adjusted by the octave setting.",
    "short_label": "ACCORD TUNE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "611-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L611-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-146",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L146"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "press",
    "action": "Answers the question with G5, using the lowest newly pressed key when several arrive together, while the ordinary keyboard sound still plays.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1495-1540",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1495-L1540"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "press",
    "action": "Plays G5 and advances the lesson only when this is the requested next key.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1542-1554",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1542-L1554"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "press",
    "action": "Plays G5 and contributes to the exact held-key chord match, with any extra held key preventing success.",
    "short_label": "CHORD LESSON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1555-1576",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1555-L1576"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "press",
    "action": "Plays G5 and, during YOUR TURN, answers with this key as the lowest new key, restarting the pattern on a wrong answer.",
    "short_label": "COPY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1408-1463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1408-L1463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1840-1851",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1840-L1851"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "press",
    "action": "Plays and toggles this key’s note in the selected column, replacing its second note if both places were full and queuing the song for saving once stopped and more than four seconds after the last marked song edit.",
    "short_label": "WRITE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1270",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1270"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1794-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1131-1145",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "release",
    "action": "Ends this key’s sound and advances one column after all keys are up if the last note operation added a note.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1797-1803",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1797-L1803"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "press",
    "action": "Plays G5 through the current writing friend without editing the song.",
    "short_label": "PLAY ALONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1246-1251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1246-L1251"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "press",
    "action": "Plays the current sound on this key without typing a name character.",
    "short_label": "NAME NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "877-936",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L877-L936"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "729-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "press",
    "action": "Plays this friend’s drum assignment for key G5, regardless of STRUM, ACCORDION or three-friend chord selection.",
    "short_label": "DRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "557-560",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L557-L560"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-124",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L124"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/eng_drum.c",
      "lines": "302-306",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/eng_drum.c#L302-L306"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/chord.c",
      "lines": "32-37",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/chord.c#L32-L37"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "release",
    "action": "Ends the notes this key began, allowing the sound’s release to ring and leaving notes held by another key sounding.",
    "short_label": "RELEASE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "649-675",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L649-L675"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "776-784",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L776-L784"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "press",
    "action": "Plays the selected track at velocity 100 and sends its note on that track's MIDI channel; however, WHITE key mode silences the black keys.",
    "short_label": "G5",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "49",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L49"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "607-629",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L607-L629"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "press",
    "action": "With the SCL page's QNT (key mode) at WHITE: plays a scale note; C4 is the root and each white key is the next note of the scale; applies on every page once set.",
    "short_label": "SCALE NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "115-151",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L115-L151"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "press",
    "action": "With the track armed and stopped, adds this note to the cursor step; release all notes to advance, while armed playback records live.",
    "short_label": "STEP NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "923-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L923-L963"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1403-1409",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1403-L1409"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "press",
    "action": "Step 16 of the shown page (steps 16, 32, 48, 64 on pages 1-4): adds or removes the selected lane's hit there and moves the cursor to it; hold it and turn a knob for a parameter lock.",
    "short_label": "STEP 16",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "547-582",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L547-L582"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "55-63",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L55-L63"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "761-769",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L761-L769"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "press_while_holding:button_fx",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "571-584",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L571-L584"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "press_while_holding:button_sel",
    "action": "Sets the root to G.",
    "short_label": "ROOT G",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "463-464",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L463-L464"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "press",
    "action": "Types 0-. phone-style (tap again within 0.8 s for the next character); in 123 mode one digit or symbol.",
    "short_label": "TYPE 0-.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "24-30",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L24-L30"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "64-73",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L64-L73"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "138-188",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L138-L188"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "release",
    "action": "Ends notes started by this key once no other held key keeps those notes sounding.",
    "short_label": "NOTE OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "645-666",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L645-L666"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "release",
    "action": "Releasing the last note key during stopped step recording advances the cursor to the next step.",
    "short_label": "ADVANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "961-963",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L961-L963"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "release",
    "action": "Removes a hit or accent pressed on an existing one, unless the held step was used for a parameter lock.",
    "short_label": "RELEASE HIT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "561-574",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L561-L574"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "609-621",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L609-L621"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "press",
    "action": "Plays a slice and moves the marker selection to that slice.",
    "short_label": "PICK SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "200-209",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L200-L209"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "press_while_holding:button_glo",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "press_while_holding:button_edit",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "press_while_holding:button_seq",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "press_while_holding:button_rec",
    "action": "Does nothing in this layer.",
    "short_label": "-",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "447-480",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L447-L480"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "press",
    "action": "Cancels calibration and restores the previous button and encoder assignments in memory without asking.",
    "short_label": "CANCEL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1467",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "press",
    "action": "Outside WRITE, adds a quiet triangle bass on track 3 one octave below this key’s lowest note when high enough, except for bass, drum or noise friends, STRUM, or ACCORDION with separate chords.",
    "short_label": "SUB OCTAVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "495-543",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L495-L543"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "569-588",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L569-L588"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/seq.c",
      "lines": "630-640",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L630-L640"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "rainbow_play",
    "gesture": "shows",
    "action": "Shows the friend, animated sky and a lower band naming the friend, recent notes, chords, effects or changed settings.",
    "short_label": "FRIEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2056-2115",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2056-L2115"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2225-2444",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2225-L2444"
     }
    ]
   },
   {
    "mode": "rainbow_one",
    "gesture": "shows",
    "action": "Shows the playing friend and recent note letters, with a staff for pitched keys.",
    "short_label": "1 FRIEND",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2334-2369",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2334-L2369"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2966-3003",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2966-L3003"
     }
    ]
   },
   {
    "mode": "rainbow_choir",
    "gesture": "shows",
    "action": "Shows three friends with the chord’s colored letters and its recognized name.",
    "short_label": "3 FRIENDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2099-2103",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2099-L2103"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2280-2300",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2280-L2300"
     }
    ]
   },
   {
    "mode": "rainbow_strum",
    "gesture": "shows",
    "action": "Shows the selected strumming chord without drawing its remapped notes on the small staff.",
    "short_label": "STRUM",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2263-2268",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2263-L2268"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1825-1826",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1825-L1826"
     }
    ]
   },
   {
    "mode": "rainbow_accordion",
    "gesture": "shows",
    "action": "Shows a black-key chord’s letters and name and draws its notes on the small staff.",
    "short_label": "ACCORDION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2270-2277",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2270-L2277"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "998-1005",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L998-L1005"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "shows",
    "action": "Shows a question mark, YES! or TRY AGAIN while the ear game asks and judges notes.",
    "short_label": "GUESS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2233-2241",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2233-L2241"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "shows",
    "action": "Shows the requested note letter when waiting and YAY! when the song ends.",
    "short_label": "FOLLOW",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2302-2313",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2302-L2313"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "shows",
    "action": "Shows the lesson chord’s colored letters and name, or YES! after a correct match.",
    "short_label": "CHORDS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2253-2261",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2253-L2261"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "shows",
    "action": "Shows LISTEN, YOUR TURN, YES!, TRY AGAIN or STAR! as the memory game progresses.",
    "short_label": "COPY ME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2243-2251",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2243-L2251"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "shows",
    "action": "Shows a large 32-column staff in pages of eight, a yellow editing column, the writing friend and WRITE.",
    "short_label": "WRITE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3081-3088",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3081-L3088"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3110-3167",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3110-L3167"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2324-2333",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2324-L2333"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "shows",
    "action": "Shows a green play column and a hopping friend for sounding notes, with LISTEN in the lower band.",
    "short_label": "SONG PLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3110-3167",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3110-L3167"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2324-2333",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2324-L2333"
     }
    ]
   },
   {
    "mode": "rainbow_name",
    "gesture": "shows",
    "action": "Shows ten name positions with the current position highlighted and hints for the two encoders, SAVE and HOME.",
    "short_label": "YOUR NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3170-3196",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3170-L3196"
     }
    ]
   },
   {
    "mode": "rainbow_volume",
    "gesture": "shows",
    "action": "Shows VOLUME with an eight-dot level indicator while HOME remains held.",
    "short_label": "VOLUME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1762-1774",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1762-L1774"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2371-2404",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2371-L2404"
     }
    ]
   },
   {
    "mode": "rainbow_look",
    "gesture": "shows",
    "action": "Briefly shows LOOK-ALIKES OFF or LOOK-ALIKES ON.",
    "short_label": "LOOK-ALIKES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2396",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2396"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2371-2404",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2371-L2404"
     }
    ]
   },
   {
    "mode": "rainbow_hat",
    "gesture": "shows",
    "action": "Briefly shows the selected hat’s name or NO HAT.",
    "short_label": "HAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2397",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2397"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2371-2404",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2371-L2404"
     }
    ]
   },
   {
    "mode": "rainbow_hello",
    "gesture": "shows",
    "action": "Shows HI! with animated letters and confetti, or greets the saved name when one is present.",
    "short_label": "HELLO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "860-875",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L860-L875"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2909-2929",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2909-L2929"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3308-3321",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3308-L3321"
     }
    ]
   },
   {
    "mode": "rainbow_drums",
    "gesture": "shows",
    "action": "Shows a drum name rather than a pitch letter and leaves the small staff quiet.",
    "short_label": "DRUM NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2118-2138",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2118-L2138"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2334-2341",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2334-L2341"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1825-1826",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1825-L1826"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "shows",
    "action": "The small treble staff keeps eight recent entries, merges nearby presses into chords, grows held-note lengths against the tempo, adds barlines and octave marks, and clears after six seconds without a new note.",
    "short_label": "STAFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "351-368",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L351-L368"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "955-1015",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L955-L1015"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "2966-3003",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L2966-L3003"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "3016-3065",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L3016-L3065"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "action": "Shows UBOOT just before entering USB boot mode after the octave-button hold.",
    "short_label": "USB BOOT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "322-330",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L322-L330"
     }
    ]
   },
   {
    "mode": "home",
    "gesture": "shows",
    "action": "Four main sound controls for the selected track over an oscilloscope.",
    "short_label": "HOME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "598-605",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L598-L605"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "1291-1297",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1291-L1297"
     }
    ]
   },
   {
    "mode": "mixer",
    "gesture": "shows",
    "action": "Level, pan, reverb send and mute for the selected track.",
    "short_label": "MIXER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "385",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L385"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "env",
    "gesture": "shows",
    "action": "Attack, decay, sustain, release of the selected track.",
    "short_label": "ENV",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "350",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L350"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "env_dest",
    "gesture": "shows",
    "action": "Envelope amounts for filter, pitch and shape.",
    "short_label": "ENV DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "351",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L351"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "lfo",
    "gesture": "shows",
    "action": "LFO rate, wave, phase, fade-in.",
    "short_label": "LFO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "lfo_dest",
    "gesture": "shows",
    "action": "LFO amounts to pitch, filter, shape, volume.",
    "short_label": "LFO DEST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "353",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L353"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "mod",
    "gesture": "shows",
    "action": "Modulation matrix: four slots of source, destination, amount.",
    "short_label": "MOD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L354"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "fx",
    "gesture": "shows",
    "action": "The track's distortion and its chorus, delay and reverb sends.",
    "short_label": "FX",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "355",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L355"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "slicer",
    "gesture": "shows",
    "action": "The track's rhythmic slicer.",
    "short_label": "SLICER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L356"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "dly",
    "gesture": "shows",
    "action": "The shared delay.",
    "short_label": "DLY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "357",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L357"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "reverb",
    "gesture": "shows",
    "action": "The shared reverb has ROOM and SPRING models.",
    "short_label": "REVERB",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L358"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "chorus",
    "gesture": "shows",
    "action": "The shared chorus.",
    "short_label": "CHORUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L359"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "scl",
    "gesture": "shows",
    "action": "The track's key, scale, how the keys follow it, transpose.",
    "short_label": "SCL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "360",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L360"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "chord",
    "gesture": "shows",
    "action": "One-finger chords: which chord and its voicing.",
    "short_label": "CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "361",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L361"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "edit1",
    "gesture": "shows",
    "action": "The engine's first four values (names change with the engine).",
    "short_label": "EDIT 1",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "362",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L362"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "edit2",
    "gesture": "shows",
    "action": "The engine's next four values.",
    "short_label": "EDIT 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "363",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L363"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "lanes",
    "gesture": "shows",
    "action": "DRUM engine only: levels of kick, snare, clap, closed hat.",
    "short_label": "LANES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "364",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L364"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "lanes2",
    "gesture": "shows",
    "action": "DRUM engine only: levels of open hat, tom, rim, bell.",
    "short_label": "LANES 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "365",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L365"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "shows",
    "action": "SLICE engine only: place, split and join slices by hand.",
    "short_label": "SLICES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "366",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L366"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "voice",
    "gesture": "shows",
    "action": "Poly/mono/legato/unison, glide, glide mode, note priority.",
    "short_label": "VOICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "372",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L372"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "voice2",
    "gesture": "shows",
    "action": "Voice allocation, detune, pan, mute.",
    "short_label": "VOICE 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "373",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L373"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "arp",
    "gesture": "shows",
    "action": "Arpeggiator mode, rate, octaves, gate.",
    "short_label": "ARP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "380",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L380"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "arp2",
    "gesture": "shows",
    "action": "Arpeggiator swing, probability, latch, note order.",
    "short_label": "ARP 2",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "381",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L381"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "song",
    "gesture": "shows",
    "action": "Up to 16 sections repeat saved projects’ steps, pattern timing and compatible automation with the current sounds, excluding engine-specific automation from a different engine.",
    "short_label": "SONG",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/song_chain.c",
      "lines": "26-40",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L26-L40"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/song_chain.c",
      "lines": "48-76",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/song_chain.c#L48-L76"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/project.c",
      "lines": "985-1026",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L985-L1026"
     }
    ]
   },
   {
    "mode": "user",
    "gesture": "shows",
    "action": "The 32 user slots keep a sound and a reduced sketch of its first 16 steps, without automation.",
    "short_label": "USER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "377",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L377"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "155-162",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L155-L162"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "345-377",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L345-L377"
     }
    ]
   },
   {
    "mode": "presets",
    "gesture": "shows",
    "action": "Browse factory and user sounds, with an optional favourites filter.",
    "short_label": "PRESETS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "376",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L376"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "phrases",
    "gesture": "shows",
    "action": "Load a factory pattern or a saved user preset's short pattern into the selected track.",
    "short_label": "PHRASES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "384",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L384"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "906-927",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L906-L927"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/upreset.c",
      "lines": "433-478",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L433-L478"
     }
    ]
   },
   {
    "mode": "project",
    "gesture": "shows",
    "action": "The four project slots A-D have load and save actions.",
    "short_label": "PROJECT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "378",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L378"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "tools",
    "gesture": "shows",
    "action": "Clear the sequence, init the sound, delete a song section, clear the song.",
    "short_label": "TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "379",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L379"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "automation",
    "gesture": "shows",
    "action": "An editable list of the track's parameter locks and automation events, with 64 records shared between four tracks.",
    "short_label": "AUTO LIST",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "step_roll",
    "gesture": "shows",
    "action": "The track's steps as a piano roll; the step cursor; step recording when the track is armed and stopped.",
    "short_label": "PIANO ROLL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "shows",
    "action": "A step grid: white keys are 16 steps of the shown page, black keys pick the drum lane.",
    "short_label": "DRUM GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "382",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L382"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "558-595",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L558-L595"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Four settings tabs: DISPLAY, CONTROL, AUDIO and SYSTEM.",
    "short_label": "MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "14-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "shows",
    "action": "Type a name of up to 12 characters with the keys.",
    "short_label": "NAME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "76-115",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L76-L115"
     }
    ]
   },
   {
    "mode": "dialog",
    "gesture": "shows",
    "action": "OCT+ accepts on release and OCT− cancels; unreadable project slots skip the overwrite question, while project loads, EDIT step clears, REC clear, SEQ TOOLS and AUTO LIST edits act without it.",
    "short_label": "QUESTION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "831-852",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L831-L852"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "861-889",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L861-L889"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1037-1048",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1037-L1048"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "shows",
    "action": "Performance effects on the white keys, track mutes on black keys 1-4, four macros on the knobs.",
    "short_label": "FX LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "shows",
    "action": "Mute and solo tracks, unmute them together, tap tempo or set the four levels.",
    "short_label": "GLO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "shows",
    "action": "A key sets the root; KNOB 1-4 are root, scale, chord, voicing.",
    "short_label": "SEL LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "shows",
    "action": "White keys choose engines or ask to initialise a sound; black keys do nothing.",
    "short_label": "EDIT LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "shows",
    "action": "Sequence tools on white keys, drum lanes on black keys and length, division, swing and gate on the knobs.",
    "short_label": "SEQ TOOLS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "shows",
    "action": "Clear the track, click, count-in, click level.",
    "short_label": "REC LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "52-65",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L52-L65"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "96-105",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L96-L105"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "shows",
    "action": "Shows the selected track, transport state and tempo above each page.",
    "short_label": "HEADER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_draw.c",
      "lines": "145-164",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_draw.c#L145-L164"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_draw.c",
      "lines": "263-285",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_draw.c#L263-L285"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "shows",
    "action": "While OCT- and OCT+ are held together (at any time while on): a countdown from 2 s, then update mode (UBOOT) at 5 s; letting go cancels; held while switching on, they start HARDWARE CALIBRATION instead.",
    "short_label": "UPDATE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "304-332",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L304-L332"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "275-277",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L275-L277"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "shows",
    "action": "With LARGE on, shows taller value cards whose text size follows the value currently displayed.",
    "short_label": "LARGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "294-317",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L294-L317"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_draw.c",
      "lines": "385-389",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_draw.c#L385-L389"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_draw.c",
      "lines": "446-454",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_draw.c#L446-L454"
     }
    ]
   },
   {
    "mode": "global",
    "gesture": "shows",
    "action": "Tempo, swing, clock source and global tuning.",
    "short_label": "GLOBAL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "374",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L374"
     }
    ]
   },
   {
    "mode": "system",
    "gesture": "shows",
    "action": "USB MIDI status, an unused sync card, MIDI routing and CPU load.",
    "short_label": "MIDI STATUS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "375",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L375"
     }
    ]
   },
   {
    "mode": "pattern",
    "gesture": "shows",
    "action": "Pattern length, clock division, swing and gate.",
    "short_label": "PATTERN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L383"
     }
    ]
   },
   {
    "mode": "chance",
    "gesture": "shows",
    "action": "Step cursor, hit probability and ratchet count.",
    "short_label": "CHANCE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "387",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L387"
     }
    ]
   },
   {
    "mode": "motion",
    "gesture": "shows",
    "action": "Enable or disable the track's automation and locks, count records or clear them.",
    "short_label": "AUTOMATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/params.c",
      "lines": "388",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/params.c#L388"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Offers colour, style, large text, animation, LED appearance and screen sleep.",
    "short_label": "DISPLAY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "14-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Offers hold time, knob acceleration, effect latching, tempo lock and scale lights.",
    "short_label": "CONTROL",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "14-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Offers speaker EQ, USB level, click mode, click level and count-in.",
    "short_label": "AUDIO",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "14-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "Offers USB serial, RESTORE LAST, calibration and ABOUT.",
    "short_label": "SYSTEM MENU",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/menu_items.c",
      "lines": "14-42",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/menu_items.c#L14-L42"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "shows",
    "action": "ABOUT shows version and credits; PRESETS scrolls and OCT- returns to the tabs.",
    "short_label": "ABOUT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "108-125",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L108-L125"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "435-445",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L435-L445"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "shows",
    "action": "After the SCREEN OFF delay, goes dark until a panel gesture wakes it, consuming that gesture.",
    "short_label": "SCREEN OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "218-239",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L218-L239"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui.c",
      "lines": "242-258",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L242-L258"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "action": "Names the next button or clockwise encoder turn; completion keeps the new assignments, while any music key or thirty seconds without input cancels and restores the previous ones.",
    "short_label": "CALIBRATION",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "274-276",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L274-L276"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_menu.c",
      "lines": "459-463",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L459-L463"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1491-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1491-L1551"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1464-1484",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1484"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "1546-1551",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1546-L1551"
     }
    ]
   }
  ]
 },
 "lights": {
  "button_fx": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "HICCUP is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to FX.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "With MENU > FX LATCH: an effect or a macro is still on.",
    "short_label": "FX ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "356",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L356"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "BACKWARDS is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to SEL.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "SLEEPY is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to ENV.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "SQUEAKY is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to LFO.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "GIANT is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to EDIT.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "FREEZE is the selected active top-row effect.",
    "short_label": "EFFECT ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This unselected effect has a faint idle glow, regardless of MENU > LEDS.",
    "short_label": "EFFECT IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to GLO.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "SPARKLE is enabled outside WRITE.",
    "short_label": "SPARKLE ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1928-1929",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1928-L1929"
     }
    ]
   },
   {
    "mode": "rainbow_write",
    "gesture": "dim",
    "action": "ARP retains its faint idle glow in WRITE, although SPARKLE is unavailable.",
    "short_label": "ARP IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "rainbow_write_play",
    "gesture": "dim",
    "action": "ARP retains its faint idle glow in WRITE, although SPARKLE is unavailable.",
    "short_label": "ARP IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to ARP.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "flash",
    "action": "An arpeggiator is playing on some track: flashes on the beat, longer on the bar's first beat (on the ARP page the flash is dark).",
    "short_label": "ARP BEAT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "142-148",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L142-L148"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "353-354",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L353-L354"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "ARP glows faintly when SPARKLE is off, regardless of MENU > LEDS.",
    "short_label": "ARP IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "WRITE is open.",
    "short_label": "WRITE ON",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1930",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1930"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "SAVE glows faintly while WRITE is closed, regardless of MENU > LEDS.",
    "short_label": "WRITE IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to SAVE.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "The green PLAY light stays on while the accompaniment or written song is playing.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1938-1946",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1938-L1946"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "The orange PLAY lamp glows faintly while stopped, regardless of MENU > LEDS.",
    "short_label": "ORANGE IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ],
    "light": "orange"
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Stopped: faint glow; playing: dark (the green LED takes over).",
    "short_label": "STOPPED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "382-383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L382-L383"
     }
    ]
   },
   {
    "light": "green",
    "mode": "felucca",
    "gesture": "lit",
    "action": "Playing.",
    "short_label": "PLAYING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "402-403",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L402-L403"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "50",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L50"
     }
    ]
   },
   {
    "light": "green",
    "mode": "felucca",
    "gesture": "flash",
    "action": "The green PLAY lamp flashes on count-in beats while the orange lamp stays dark.",
    "short_label": "COUNT-IN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "382-383",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L382-L383"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "402-403",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L402-L403"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "off",
    "action": "The green PLAY lamp is dark while transport is stopped.",
    "short_label": "GREEN OFF",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ],
    "light": "green"
   }
  ],
  "button_seq": [
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This button glows faintly at Rainbow’s fixed idle level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "The page shown belongs to SEQ.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This button glows faintly at Rainbow’s fixed idle level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Its layer's map is on screen.",
    "short_label": "LAYER OPEN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "357-358",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L357-L358"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "A track is armed for recording.",
    "short_label": "ARMED",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "359",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L359"
     }
    ]
   }
  ],
  "button_home": [
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This button glows faintly at Rainbow’s fixed idle level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "Shows that HOME is open; MIXER uses GLO's light instead.",
    "short_label": "PAGE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "59-62",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L59-L62"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "351-352",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L351-L352"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle buttons glow faintly with LEDS DIM HI or DIM LO, stay dark with OFF, or reverse their active and idle appearance with INV.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-294",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L294"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "380-395",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L380-L395"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This button glows faintly at Rainbow’s fixed idle level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "Keys shifted below octave 0; on action pages and in dialogs: OCT- is back.",
    "short_label": "OCT DOWN",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "71-85",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L71-L85"
     }
    ]
   },
   {
    "mode": "menu",
    "gesture": "breathing",
    "action": "The selected menu value can step back.",
    "short_label": "PREV VALUE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "71-85",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L71-L85"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "action": "In GLO, SEL, EDIT, SEQ or REC layers: OCT- puts back the layer's changes.",
    "short_label": "UNDO LAYER",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "71-85",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L71-L85"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "This button glows faintly at Rainbow’s fixed idle level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "Keys shifted above octave 0.",
    "short_label": "OCT UP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "71-85",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L71-L85"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "breathing",
    "action": "Breathes when OCT+ can confirm an action, save a name, open a settings item or advance a settings value.",
    "short_label": "PRESS ME",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "71-84",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L71-L84"
     }
    ]
   }
  ],
  "key_lights": [
   {
    "mode": "rainbow_play",
    "gesture": "lit",
    "action": "Held keys light, with game prompts added to them.",
    "short_label": "HELD KEY",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1931-1935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "rainbow_guess",
    "gesture": "blinking",
    "action": "After two wrong answers, the requested key blinks while held keys remain lit.",
    "short_label": "GUESS HINT",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1582-1590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1582-L1590"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1931-1935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "rainbow_follow",
    "gesture": "lit",
    "action": "The next required key lights alongside any held keys.",
    "short_label": "NEXT NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1582-1590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1582-L1590"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1931-1935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "lit",
    "action": "The requested chord lights until matched, alongside held keys.",
    "short_label": "CHORD KEYS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1593-1603",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1593-L1603"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1931-1935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "rainbow_chords",
    "gesture": "blinking",
    "action": "With the lesson’s bass accompaniment playing, the next chord blinks during the last beat of each bar.",
    "short_label": "NEXT CHORD",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1593-1601",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1593-L1601"
     }
    ]
   },
   {
    "mode": "rainbow_copy",
    "gesture": "lit",
    "action": "Each demonstrated pattern note lights while it sounds, alongside held keys.",
    "short_label": "COPY NOTE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1588-1590",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1588-L1590"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1931-1935",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1931-L1935"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "lit",
    "action": "Shows held keys and sounding notes from MIDI, the sequencer or arpeggiator, or the selected step when its piano roll is stopped.",
    "short_label": "NOTES",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "265-279",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L265-L279"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "197-220",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L197-L220"
     }
    ]
   },
   {
    "mode": "felucca",
    "gesture": "dim",
    "action": "Idle keys glow faintly (MENU > LEDS); MENU > SCALE LEDS: the selected track's scale glows, the root brighter.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "282-337",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L282-L337"
     },
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "238-263",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L238-L263"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "lit",
    "action": "White keys: hits of the selected lane on the shown page (accents while ACC is held); the playing step shows as a moving light; black keys: the selected lane, ACC while held, the page keys when the pattern is longer than 16.",
    "short_label": "GRID",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "90-107",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L90-L107"
     }
    ]
   },
   {
    "mode": "step_grid",
    "gesture": "dim",
    "action": "Steps 1, 5, 9, 13 of the page glow a little brighter so you can count beats.",
    "short_label": "BEATS",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_input.c",
      "lines": "114-126",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L114-L126"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "lit",
    "action": "An available FX effect or performance mute is held or latched on.",
    "short_label": "FX ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-628",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L628"
     }
    ]
   },
   {
    "mode": "layer_fx",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "lit",
    "action": "Keys whose function is on right now (an effect held, a track sounding, the root, the current engine, the selected lane, a setting on).",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_glo",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "lit",
    "action": "Keys whose function is on right now (an effect held, a track sounding, the root, the current engine, the selected lane, a setting on).",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_scl",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "lit",
    "action": "Keys whose function is on right now (an effect held, a track sounding, the root, the current engine, the selected lane, a setting on).",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_edit",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "lit",
    "action": "Keys whose function is on right now (an effect held, a track sounding, the root, the current engine, the selected lane, a setting on).",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_seq",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "lit",
    "action": "Keys whose function is on right now (an effect held, a track sounding, the root, the current engine, the selected lane, a setting on).",
    "short_label": "ACTIVE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "layer_rec",
    "gesture": "breathing",
    "action": "Keys that do something in this layer and can be pressed.",
    "short_label": "AVAILABLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_layer.c",
      "lines": "619-653",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L619-L653"
     }
    ]
   },
   {
    "mode": "name",
    "gesture": "lit",
    "action": "Every key that types or edits; the key being cycled blinks.",
    "short_label": "TYPING",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_name.c",
      "lines": "20",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_name.c#L20"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "flash",
    "action": "On a clean start, the key lights sweep unless animation is off.",
    "short_label": "SWEEP",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/main.c",
      "lines": "217-227",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L217-L227"
     }
    ]
   },
   {
    "mode": "slices",
    "gesture": "lit",
    "action": "Marks the keys that play the currently selected slice.",
    "short_label": "PICKED SLICE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/ui_slice.c",
      "lines": "212-221",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_slice.c#L212-L221"
     }
    ]
   },
   {
    "mode": "rainbow_play",
    "gesture": "dim",
    "action": "Unlit note and game keys retain a faint idle glow at Rainbow’s fixed level, regardless of MENU > LEDS.",
    "short_label": "IDLE",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "joshbartlettband-web/felucca-rainbow",
      "ref": "1.1.5-rb",
      "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
      "path": "firmware/src/kid.c",
      "lines": "1923-1947",
      "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1923-L1947"
     }
    ]
   }
  ]
 },
 "groups": {
  "key_lights": [
   "led_a3",
   "led_a4",
   "led_as3",
   "led_as4",
   "led_b3",
   "led_b4",
   "led_c4",
   "led_c5",
   "led_cs4",
   "led_cs5",
   "led_d4",
   "led_d5",
   "led_ds4",
   "led_ds5",
   "led_e4",
   "led_e5",
   "led_f3",
   "led_f4",
   "led_f5",
   "led_fs3",
   "led_fs4",
   "led_fs5",
   "led_g3",
   "led_g4",
   "led_g5",
   "led_gs3",
   "led_gs4"
  ]
 },
 "friends": [
  {
   "name": "DUCKY",
   "engine": "FM6",
   "preset": "TINE EP",
   "sky": "Bubbles",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "123",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L123"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1736",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1736"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "PINK DUCKY",
   "engine": "WHEEL",
   "preset": "SOFT FLUTE",
   "sky": "Hearts",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "124",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L124"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1737",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1737"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "COOL DUCKY",
   "engine": "ANALOG",
   "preset": "SAW LEAD",
   "sky": "Confetti",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "125",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L125"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1738",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1738"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "AXOLOTL",
   "engine": "PHYS",
   "preset": "KALIMBA",
   "sky": "Bubbles",
   "beat": "REGGAE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "126",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L126"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1739",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1739"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "UNICORN",
   "engine": "GRAIN",
   "preset": "SHIMMER",
   "sky": "Rainbow",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "127",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L127"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1740",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1740"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GIRAFFE",
   "engine": "FM6",
   "preset": "MARIMBA",
   "sky": "Flowers",
   "beat": "SAMBA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "128",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L128"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1741",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1741"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GOO",
   "engine": "VOICE",
   "preset": "WOW BASS",
   "sky": "Hearts",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "129",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L129"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1742",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1742"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GOOBERT",
   "engine": "ANALOG",
   "preset": "PLUCK",
   "sky": "Confetti",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "130",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L130"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1743",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1743"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "BLUE PUP",
   "engine": "LOFI",
   "preset": "PULSE LD",
   "sky": "Flowers",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "131",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L131"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1744",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1744"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1712",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1712"
    }
   ],
   "stand_in": "SPOTTY PUP"
  },
  {
   "name": "RED MONSTER",
   "engine": "VOICE",
   "preset": "VOX LEAD",
   "sky": "Street",
   "beat": "MARCH",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "132",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L132"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1745",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1745"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1714",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1714"
    }
   ],
   "stand_in": "FUZZY"
  },
  {
   "name": "BLUE MONSTER",
   "engine": "WHEEL",
   "preset": "FULL ORGAN",
   "sky": "Street",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "133",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L133"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1746",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1746"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1715",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1715"
    }
   ],
   "stand_in": "BIG BLUE"
  },
  {
   "name": "APRIL",
   "engine": "PHASE",
   "preset": "BRASS",
   "sky": "Flowers",
   "beat": "TRAIN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "134",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L134"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1747",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1747"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SCISSORS",
   "engine": "DRUM",
   "preset": "DRUM KIT",
   "sky": "Confetti",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "135",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L135"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1748",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1748"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GHOST",
   "engine": "VOICE",
   "preset": "CHOIR AAH",
   "sky": "Stars",
   "beat": "SPOOKY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "136",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L136"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1749",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1749"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "WEB HERO",
   "engine": "TRIO",
   "preset": "SYNC LEAD",
   "sky": "Stars",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "137",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L137"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1750",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1750"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1716",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1716"
    }
   ],
   "stand_in": "SPIDER"
  },
  {
   "name": "BUTTERFLY",
   "engine": "FM6",
   "preset": "BELL",
   "sky": "Flowers",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "138",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L138"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1751",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1751"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "KITTY",
   "engine": "PHYS",
   "preset": "HARP",
   "sky": "Hearts",
   "beat": "SAMBA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "139",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L139"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1752",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1752"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "FROG",
   "engine": "LOFI",
   "preset": "WAVE BASS",
   "sky": "Bubbles",
   "beat": "REGGAE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "140",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L140"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1753",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1753"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "ROBOT",
   "engine": "LOFI",
   "preset": "ARP 8BIT",
   "sky": "Stars",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "141",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L141"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1754",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1754"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "RAINBOW",
   "engine": "GRAIN",
   "preset": "CLOUD PAD",
   "sky": "Rainbow",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "142",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L142"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1755",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1755"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "PRINCESS DUCKY",
   "engine": "TRIO",
   "preset": "CHIP CHOIR",
   "sky": "Hearts",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "143",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L143"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1756",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1756"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "RED PUP",
   "engine": "LOFI",
   "preset": "STEP LEAD",
   "sky": "Flowers",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "144",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L144"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1757",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1757"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1713",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1713"
    }
   ],
   "stand_in": "FOX"
  },
  {
   "name": "YELLOW BIRD",
   "engine": "ANALOG",
   "preset": "SINE KEY",
   "sky": "Street",
   "beat": "MARCH",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "145",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L145"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1758",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1758"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1718",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1718"
    }
   ],
   "stand_in": "CHICK"
  },
  {
   "name": "SLIMY",
   "engine": "GRAIN",
   "preset": "GLITCH",
   "sky": "Stars",
   "beat": "SPOOKY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "146",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L146"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1759",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1759"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1717",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1717"
    }
   ],
   "stand_in": "PUMPKIN"
  },
  {
   "name": "BUNNY",
   "engine": "PHYS",
   "preset": "PLUCK",
   "sky": "Flowers",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "147",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L147"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1760",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1760"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "PANDA",
   "engine": "FM6",
   "preset": "PAD",
   "sky": "Rainbow",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "148",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L148"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1761",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1761"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "PENGUIN",
   "engine": "LOFI",
   "preset": "WAVE LEAD",
   "sky": "Stars",
   "beat": "MARCH",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "149",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L149"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1762",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1762"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "OWL",
   "engine": "VOICE",
   "preset": "WHISPER",
   "sky": "Stars",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "150",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L150"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1763",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1763"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "BEE",
   "engine": "TRIO",
   "preset": "ARP LEAD",
   "sky": "Flowers",
   "beat": "SAMBA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "151",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L151"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1764",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1764"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "LADYBUG",
   "engine": "PHYS",
   "preset": "BELL TREE",
   "sky": "Flowers",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "152",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L152"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1765",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1765"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "DINO",
   "engine": "ANALOG",
   "preset": "ACID",
   "sky": "Confetti",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "153",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L153"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1766",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1766"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "WHALE",
   "engine": "GRAIN",
   "preset": "FROZEN",
   "sky": "Bubbles",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "154",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L154"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1767",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1767"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "OCTOPUS",
   "engine": "PHYS",
   "preset": "MARIMBA",
   "sky": "Bubbles",
   "beat": "REGGAE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "155",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L155"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1768",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1768"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "FISH",
   "engine": "FM6",
   "preset": "PLUCK",
   "sky": "Bubbles",
   "beat": "REGGAE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "156",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L156"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1769",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1769"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "TURTLE",
   "engine": "PHYS",
   "preset": "HAND DRUM",
   "sky": "Bubbles",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "157",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L157"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1770",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1770"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "ICE CREAM",
   "engine": "TRIO",
   "preset": "RING BELL",
   "sky": "Confetti",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "158",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L158"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1771",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1771"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "CUPCAKE",
   "engine": "WHEEL",
   "preset": "JAZZ PERC",
   "sky": "Hearts",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "159",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L159"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1772",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1772"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "ROCKET",
   "engine": "NOISE",
   "preset": "ARCADE",
   "sky": "Stars",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "160",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L160"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1773",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1773"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "STRAWBERRY",
   "engine": "ANALOG",
   "preset": "PLUCK",
   "sky": "Hearts",
   "beat": "SAMBA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "161",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L161"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1774",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1774"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "STAR",
   "engine": "PHASE",
   "preset": "BELL",
   "sky": "Stars",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "162",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L162"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1775",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1775"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "T-REX",
   "engine": "ANALOG",
   "preset": "SAW",
   "sky": "Flowers",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "164",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L164"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1776",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1776"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SKELETON",
   "engine": "ANALOG",
   "preset": "SINE KEY",
   "sky": "Stars",
   "beat": "SPOOKY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "165",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L165"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1777",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1777"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1719",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1719"
    }
   ],
   "stand_in": "BAT"
  },
  {
   "name": "RANCHER",
   "engine": "PHYS",
   "preset": "PLUCK",
   "sky": "Flowers",
   "beat": "HOEDOWN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "166",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L166"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1778",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1778"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1720",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1720"
    }
   ],
   "stand_in": "HORSE"
  },
  {
   "name": "RODEO",
   "engine": "ANALOG",
   "preset": "PLUCK",
   "sky": "Hearts",
   "beat": "HOEDOWN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "167",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L167"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1779",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1779"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1721",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1721"
    }
   ],
   "stand_in": "CACTUS"
  },
  {
   "name": "VACUUM",
   "engine": "ANALOG",
   "preset": "RAVE",
   "sky": "Confetti",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "168",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L168"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1780",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1780"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SPACE HERO",
   "engine": "TRIO",
   "preset": "SAW3",
   "sky": "Stars",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "169",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L169"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1781",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1781"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1722",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1722"
    }
   ],
   "stand_in": "ALIEN"
  },
  {
   "name": "BEAT BOT",
   "engine": "DRUM",
   "preset": "DRUM KIT",
   "sky": "Confetti",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "171",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L171"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1782",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1782"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "TOY DRUM",
   "engine": "DRUM",
   "preset": "DRUM KIT",
   "sky": "Flowers",
   "beat": "MARCH",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "172",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L172"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1783",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1783"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "BONGO",
   "engine": "DRUM",
   "preset": "DRUM KIT",
   "sky": "Hearts",
   "beat": "SALSA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "173",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L173"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1784",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1784"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "MONKEY",
   "engine": "DRUM",
   "preset": "DRUM KIT",
   "sky": "Stars",
   "beat": "SKA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "174",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L174"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1785",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1785"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "ELEPHANT",
   "engine": "ANALOG",
   "preset": "BRASS",
   "sky": "Desert",
   "beat": "POLKA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "176",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L176"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1786",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1786"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "RACE CAR",
   "engine": "TRIO",
   "preset": "SYNC LEAD",
   "sky": "Clouds",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "177",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L177"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1787",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1787"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "JELLYFISH",
   "engine": "ANALOG",
   "preset": "STRINGS",
   "sky": "Bubbles",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "178",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L178"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1788",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1788"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "BEAR",
   "engine": "ANALOG",
   "preset": "SQR BASS",
   "sky": "Leaves",
   "beat": "TRAP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "179",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L179"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1789",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1789"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SNOWMAN",
   "engine": "TRIO",
   "preset": "RING BELL",
   "sky": "Snow",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "180",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L180"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1790",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1790"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "CRAB",
   "engine": "ANALOG",
   "preset": "PLUCK",
   "sky": "Bubbles",
   "beat": "FUNK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "181",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L181"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1791",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1791"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "WOLF",
   "engine": "ANALOG",
   "preset": "SAW LEAD",
   "sky": "Stars",
   "beat": "SPOOKY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "182",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L182"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1792",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1792"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "CAMEL",
   "engine": "ANALOG",
   "preset": "SAW LEAD",
   "sky": "Desert",
   "beat": "TRAIN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "183",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L183"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1793",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1793"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SCIENTIST",
   "engine": "ANALOG",
   "preset": "ACID",
   "sky": "Confetti",
   "beat": "ACID",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "185",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L185"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1794",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1794"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "FLYTRAP",
   "engine": "ANALOG",
   "preset": "ACID",
   "sky": "Flowers",
   "beat": "ACID",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "187",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L187"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1795",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1795"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SUNFLOWER",
   "engine": "ANALOG",
   "preset": "ACID",
   "sky": "Clouds",
   "beat": "ACID",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "189",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L189"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1796",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1796"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SPIDER MOM",
   "engine": "PHASE",
   "preset": "RESO",
   "sky": "Rainbow",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "192",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L192"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1797",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1797"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1723",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1723"
    }
   ],
   "stand_in": "RAINBOW MOM"
  },
  {
   "name": "DRAGON DUCK",
   "engine": "VOICE",
   "preset": "VOX LEAD",
   "sky": "Clouds",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "193",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L193"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1798",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1798"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SPIDER GRANDMA",
   "engine": "WHEEL",
   "preset": "GOSPEL",
   "sky": "Stars",
   "beat": "ROCK",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "194",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L194"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1799",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1799"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1724",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1724"
    }
   ],
   "stand_in": "GREEN GRANNY"
  },
  {
   "name": "NIGHT LIGHT",
   "engine": "ANALOG",
   "preset": "SOFT PAD",
   "sky": "Stars",
   "beat": "LULLABY",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "195",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L195"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1800",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1800"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GREEN QUEEN",
   "engine": "PHASE",
   "preset": "STRING",
   "sky": "Rainbow",
   "beat": "DANCE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "196",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L196"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1801",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1801"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "KING AXOLOTL",
   "engine": "FM6",
   "preset": "BRASS",
   "sky": "Bubbles",
   "beat": "MARCH",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "197",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L197"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1802",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1802"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "FAIRY MONSTER",
   "engine": "TRIO",
   "preset": "RING BELL",
   "sky": "Street",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "198",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L198"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1803",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1803"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1725",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1725"
    }
   ],
   "stand_in": "PIXIE"
  },
  {
   "name": "MORNING GLORY",
   "engine": "ANALOG",
   "preset": "WIND",
   "sky": "Flowers",
   "beat": "REGGAE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "199",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L199"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1804",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1804"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "GROUCH",
   "engine": "TRIO",
   "preset": "FAT BASS",
   "sky": "Street",
   "beat": "HIP HOP",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "200",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L200"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1805",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1805"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1726",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1726"
    }
   ],
   "stand_in": "ALLEY CAT"
  },
  {
   "name": "TIGER CUB",
   "engine": "PHASE",
   "preset": "ORGAN",
   "sky": "Leaves",
   "beat": "TRAIN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "201",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L201"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1806",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1806"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1727",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1727"
    }
   ],
   "stand_in": "LION CUB"
  },
  {
   "name": "RACCOON",
   "engine": "PHASE",
   "preset": "WIRE",
   "sky": "Stars",
   "beat": "DISCO",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "202",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L202"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1807",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1807"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1728",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1728"
    }
   ],
   "stand_in": "SQUIRREL"
  },
  {
   "name": "GOLDENROD",
   "engine": "ANALOG",
   "preset": "STRINGS",
   "sky": "Leaves",
   "beat": "HOEDOWN",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "203",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L203"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1808",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1808"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "PIANO PAL",
   "engine": "SAMPLE",
   "preset": "PIANO",
   "sky": "Stars",
   "beat": "BOSSA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "204",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L204"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1809",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1809"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "FLUTE BIRD",
   "engine": "SAMPLE",
   "preset": "FLUTE",
   "sky": "Clouds",
   "beat": "SAMBA",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "205",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L205"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1810",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1810"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  },
  {
   "name": "SAX CAT",
   "engine": "SAMPLE",
   "preset": "SAX",
   "sky": "Bubbles",
   "beat": "SHUFFLE",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "206",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L206"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "tools/gen_kid_art.py",
     "lines": "1811",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1811"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/engines.c",
     "lines": "27-46",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/engines.c#L27-L46"
    }
   ]
  }
 ],
 "hats": {
  "names": [
   "PARTY",
   "CROWN",
   "TOP HAT",
   "BUCKET",
   "WIZARD",
   "BEANIE",
   "WESTERN",
   "CHEF",
   "PROPELLER",
   "FLOWERS"
  ],
  "source": [
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "tools/gen_kid_art.py",
    "lines": "1989-1990",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/tools/gen_kid_art.py#L1989-L1990"
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "Rainbow keeps one WRITE song, its greeting name, hat, volume ceiling and look-alike choice with the shared Felucca settings. WRITE saves while stopped once more than four seconds have passed since its last marked edit, and when leaving WRITE. If those four seconds pass during playback, it saves as soon as playback stops. The grown-ups’ settings save immediately while stopped or wait for playback to stop. The hidden Felucca keeps four projects, thirty-two user sounds and their attached FM6 patches, three user samples and a working-session autosave. Full projects hold the four tracks; a USER sound saves only its first sixteen pattern steps and no automation. Full Felucca autosaves changed music after ten quiet seconds, at least sixty seconds between successful writes, while RESTORE LAST is on. There is no save at power-off. Rainbow play does not run that autosave. COPY ME stars are not kept after leaving the game in this build. From the flash atlas: install (update loader): Checks the firmware package and unit identity, then replaces only changed program data. It leaves the startup code alone. This version accepts larger firmware packages than newer Felucca, but still writes only the program area (An accepted incoming package; app range still ends 0x93000 regardless accepted larger image length). successful installation record cleanup: After installation, removes only valid update records. Saved music does not meet that check (Erases only a 4 KiB sector whose last 256 bytes hold a valid update record: marker 0x5441 at +6 and a matching nonzero CRC16 over bytes 2..79. In practice this is 0xE4000 and, on a first install from stock, 0xE8000. Saved music does not hold that record). every startup: At startup, clears leftover data where firmware updates are prepared, even when another firmware stored it there (Any nonblank byte in those two probes). startup legacy FM6 migration: At startup, converts a compatible older FM6 bank only if no current user-patch bank can be opened. The first write leaves the newest intact old copy alone. It does not clear all saved music or save settings merely because it started (The compatible old bank survives; newer incompatible type 7 data does not trigger migration). leaving through installer upgrade command: Starting an update clears room for the incoming loader. A failed attempt can clear that room even before any new data arrives. Holding both octave buttons for 5 seconds enters UBOOT without preparing an update (Upgrade command, whether accepted or rejected by ota_stage; official loader requires matching device/package flash head). official-installer return to stock V15: The page downloads a backup from the connected unit before asking to install stock firmware. In loader mode it cannot make a new backup: it requires confirmation that you already have one. This backup leaves out optional hand-set slices and the automatic session save; it is not a complete copy of the unit. Projects Rainbow cannot open are saved as empty entries, and restoring those entries clears their slots. Back up newer Felucca projects in Felucca before starting Rainbow (Normal return requires archive-capable firmware; loader recovery requires explicit acknowledgement). optional name sent after installing from site: If you entered a greeting name in the installer, it sends that name after installation and requests a settings save. The save is immediate if playback is stopped; this is an installer action rather than an unconditional startup write (Owner supplied a nonempty name on installer page). What Rainbow Mode writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over Rainbow Mode's is in when_you_leave.",
  "lost": "WRITE and the grown-ups’ choices rewrite the shared settings record; they are separate from the hidden Felucca music autosave. Exiting the toy restores a readable working-session autosave when RESTORE LAST is on. Without one, the remaining music stays in memory; it is not saved automatically until it changes. This build opens its own projects and supported older project formats. A newer project format it cannot read appears empty and can be saved over without an overwrite question. Before changing versions, make a backup using a version that can still open the work. From the flash atlas: Other firmwares reading Rainbow Mode's data: Felucca [Salt] takes over Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices); Felucca [Salt] reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions); WaveLoop FM-1 takes over Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; your old FM6 bank (B1–B27), converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); WaveLoop FM-1 reads and uses Rainbow Mode's user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; FM6 patches used by the thirty-two user sounds; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable); Felucca takes over Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; your old FM6 bank (B1–B27); last session in the full version of Felucca, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens; If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); Felucca reads and uses Rainbow Mode's user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; FM6 patches used by the thirty-two user sounds; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate); SLOOP reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it); SLOOP DX7 Banks reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); SLOOP Floyd FM reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops); FM1 Quest reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE (USR1 plays only if its audio and zones fit Quest’s 64 KiB slot. Sending into or erasing USR1 replaces it, including holding REC on a readable USR1 in IMPORTER. Sending into or erasing USR2 can damage the end of the old USR1. Extra slice markers are not used here); JIANT lists Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; FM6 patches used by the thirty-two user sounds, but plays them differently (JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead); JIANT takes over Rainbow Mode's Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; your old FM6 bank (B1–B27); last session in the full version of Felucca, converting them (JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept; Only patches linked to compatible FM6 user sounds are copied. Rainbow never reads its old FM6 bank again once JIANT's new patch bank exists); ChoralRoot takes over Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; your old FM6 bank (B1–B27), converting them (After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return; This applies only if the older 27-slot bank is still stored. A newer bank of FM6 patches in the same storage is separate and is not imported); ChoralRoot lists Rainbow Mode's user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation, but plays them differently (Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from); GHOULBOX lists Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation, but plays them differently; GHOULBOX takes over Rainbow Mode's Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; your old FM6 bank (B1–B27); last session in the full version of Felucca, converting them; GHOULBOX reads and uses Rainbow Mode's FM6 patches used by the thirty-two user sounds; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; fm1-chord takes over Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation, converting them (Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered); fm1-chord reads and uses Rainbow Mode's your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored); MAKU reads and uses Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; FM6 patches used by the thirty-two user sounds; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (MAKU leaves these sample bytes in place, but its controls use built-in material; these uploaded samples are not available to play here); MAKU takes over Rainbow Mode's your old FM6 bank (B1–B27), converting them; Jangada reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; Skiff takes over Rainbow Mode's Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; your old FM6 bank (B1–B27); last session in the full version of Felucca, converting them (This changes how the project is stored and plays. This firmware change has not been tested on an FM-1); Skiff lists Rainbow Mode's user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation, but plays them differently (The same saved sound format does not guarantee the same sound or pattern playback); Skiff reads and uses Rainbow Mode's FM6 patches used by the thirty-two user sounds; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (A separate saved FM6 patch works only while its matching FM6 user sound is still stored; Skiff uses its own sound engines, so saved loops or slices can play differently); Hortator lists Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE, but plays them differently (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); ORBIT takes over Rainbow Mode's user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation, converting them (Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play); ORBIT reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); PIGEON reads and uses Rainbow Mode's Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (calibration and shared preferences can still be read, but the WRITE song is not kept; Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same; Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio); PIGEON takes over Rainbow Mode's Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; last session in the full version of Felucca, converting them (Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup); winampFM Synth reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); FM1 Move reads and uses Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE (Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules); X0X lists Rainbow Mode's User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE, but plays them differently (Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used); Jangada converts only older version 1 sounds in this group. Newer sound versions look empty, and saving anywhere in the group drops them from the rewritten group.; Skiff imports some settings and calibration, but can change and save the previous firmware’s preferences without asking. What Rainbow Mode reads of other firmwares' data: Rainbow Mode reads and uses Felucca's settings, button calibration, favourites, MIDI LEARN map; user presets 1-16; user presets 17-32; FM6 patches of the FM6 user presets; user sample slot USR1; user sample slot USR2; user sample slot USR3; Rainbow Mode reads and uses JIANT's settings, calibration, favourites, MENU options; user sounds U01-U16; user sounds U17-U32; FM6 patches for the FM6 user sounds; Rainbow Mode reads and uses GHOULBOX's settings and panel calibration; user sounds 1–16; user sounds 17–32; FM6 patches for user sounds; user sample slot USR1; user sample slot USR2; user sample slot USR3; Rainbow Mode takes over Hortator's settings and panel calibration, converting them; Rainbow Mode reads and uses Skiff's settings, calibration and favourites; user sound bank 1; user sound bank 2; user sounds’ own FM6 patches; user sample USR1; user sample USR2; user sample USR3; Rainbow Mode reads and uses SLOOP's user sounds U01-U16; user sounds U17-U32; user sample slot USR1; user sample slot USR2; user sample slot USR3; Rainbow Mode reads and uses X0X's break loops slot 1; break loops slot 2; break loops slot 3; Rainbow Mode reads and uses Hortator's user samples USR1; user samples USR2; user samples USR3; Rainbow Mode lists sloopDX's user presets 1–16; user presets 17–32, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS); Rainbow Mode takes over MAKU's settings and calibration, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices); Rainbow Mode lists MAKU's inherited user preset bank 1; inherited user preset bank 2, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. MAKU’s insert controls become timing and modulation controls in Felucca. Earlier firmware ignores them. The insert sound is not kept); Rainbow Mode reads and uses MAKU's inherited FM6 patches for user presets; inherited user sample 1; inherited user sample 2; inherited user sample 3 (Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate); Rainbow Mode lists fm1-chord's user sounds 1-16; user sounds 17-32, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. The other firmware’s extra instrument is unavailable here. Its sounds appear empty); Rainbow Mode takes over fm1-chord's FM6 bank B1-B27, converting them (If a valid bank of FM6 patches for your sounds from another firmware remains, the older bank is not changed to the new format at start-up); Rainbow Mode reads and uses fm1-chord's uploaded sample USR1 and optional SLICE markers; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers (Only data in this sample slot is read. Other saved work is separate); Rainbow Mode lists SLOOP DX7 Banks's user sounds 1–16; user sounds 17–32; user sample USR1; user sample USR2; user sample USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Rainbow Mode reads and uses Jangada's user samples USR1; user samples USR2; user samples USR3 (Only data in this sample slot is read. Other saved work is separate); Rainbow Mode takes over WaveLoop FM-1's settings, calibration and favourites; song 1; song 2; song 3; last session saved for the next start, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here); Rainbow Mode lists WaveLoop FM-1's user sounds 1–16; user sounds 17–32, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question); Rainbow Mode reads and uses WaveLoop FM-1's FM6 patches and controls for each drum in user sounds; user sample USR1; user sample USR2 (Changing a sound or its format can make its separate patch unavailable. WaveLoop also saves patches with DRUM sounds. Other firmware does not use them as WaveLoop drum patches; Only data in this sample slot is read. Other saved work is separate); Rainbow Mode reads and uses ORBIT's sample slot USR1; sample slot USR2; sample slot USR3 (Only data in this sample slot is read. Other saved work is separate); Rainbow Mode lists SLOOP Floyd FM's user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Rainbow Mode lists winampFM Synth's user sounds 1-16; user sounds 17-32; sample USR1; sample USR2; sample USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Rainbow Mode takes over Felucca [Salt]'s project 1; project 2; project 3; project 4, converting them (Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens); Rainbow Mode lists Felucca [Salt]'s user sounds U01-U16; user sounds U17-U32, but plays them differently (Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded); Rainbow Mode reads and uses Felucca [Salt]'s user sample USR1; user sample USR2; user sample USR3 (Only data in this sample slot is read. Other saved work is separate); Rainbow Mode takes over PIGEON's preferences, MIDI LEARN and panel calibration; older FM6 patch bank PIGEON no longer uses, converting them (These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices; If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format); Rainbow Mode reads and uses PIGEON's older user preset bank 1; older user preset bank 2; older FM6 patches for user presets; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question; Changing a sound or its format can make its separate patch unavailable; Only data in this sample slot is read. Other saved work is separate); Rainbow Mode lists FM1 Move's user sounds U01–U16; user sounds U17–U32; sample slot USR1; sample slot USR2; sample slot USR3, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different); Rainbow Mode lists FM1 Quest's user sounds U01–U16; user sounds U17–U32; sample USR1, but plays them differently (Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Only the first sample is stored in the same place. The other two sample slots use different storage). Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "Make the backup with the firmware that created the work before Rainbow’s first start: Rainbow cannot export project slots it cannot read, including Felucca 1.6.1 projects. Its archive records those slots as empty, and restoring it clears them without a question on the unit. The installer’s automatic archive before returning to stock has this same limit; it is not a substitute for the earlier backup. Use the editor’s archive to keep current music, the saved projects Rainbow can read, user sounds with their attached FM6 patches, settings including the Rainbow song and greeting, and the three user samples. A USER sound alone is not a full pattern or project backup. The archive does not keep a separate working-session autosave or hand-set SLICE markers. Write down those markers if needed. Restoring settings replaces the Rainbow song and preferences too; restoring a sample can lose that sample if the transfer stops. The restore commits each saved item separately, so an interruption can leave only part of the archive restored. Computer writes have no confirmation on the unit, and UNDO does not recover overwritten flash. The official installer reads and downloads an archive before its normal return-to-stock confirmation. A recovery install from update-loader mode requires a backup made earlier.",
  "going_back": "Keep an archive made before changing versions. This build writes projects in the Felucca 1.1 generation; Felucca versions before 1.1 cannot open those projects. Its attached FM6 user-patch storage also needs Felucca 1.0.3 or later. Projects saved in later formats may need a newer reader than the one inside Rainbow. Keep the original sample files and SLICE marker notes as well as the archive. Rainbow’s project saves, renames and restores, user-sound saves, renames, erases, sends to the FM-1 and restores, and USR1 sample sends to the FM-1, erases, slice edits and restores can also replace ChoralRoot’s legacy sounds 1–32, VA patches, FM6 patches 1–32, CZ patches 1–32 and FM TONE patches, kept for returning to ChoralRoot 0.21 or older.",
  "switching_table_status": "See the switching advice in this section. Back up with the firmware that made the work before Rainbow’s first start, and before switching away; other firmwares can also overwrite Rainbow data at start-up or during ordinary use.",
  "source": [
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "808-827",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L808-L827"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "896-947",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L896-L947"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1026-1092",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1026-L1092"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1131-1145",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1221-1226",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1221-L1226"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1437-1447",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1437-L1447"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1483-1488",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1483-L1488"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1794-1795",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1794-L1795"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "772-784",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L772-L784"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/main.c",
    "lines": "364-367",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L364-L367"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "1029-1060",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1060"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "1078-1087",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1078-L1087"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "1123-1190",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1123-L1190"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "73-81",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L73-L81"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "128-135",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L128-L135"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "473-530",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L473-L530"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "731-738",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L731-L738"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/storage.c",
    "lines": "188-196",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/storage.c#L188-L196"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_input.c",
    "lines": "882-889",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L882-L889"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/upreset.c",
    "lines": "344-379",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L344-L379"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor_backup.c",
    "lines": "11-59",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_backup.c#L11-L59"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor_backup.c",
    "lines": "91-156",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_backup.c#L91-L156"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor.c",
    "lines": "87-130",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor.c#L87-L130"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/slice_store.c",
    "lines": "21-36",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/slice_store.c#L21-L36"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/index_pkg.html",
    "lines": "248-275",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/index_pkg.html#L248-L275"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "45-60",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L45-L60"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "3-25",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L3-L25"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_layer.c",
    "lines": "154-161",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L154-L161"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_layer.c",
    "lines": "215-222",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_layer.c#L215-L222"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui.c",
    "lines": "1186-1192",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui.c#L1186-L1192"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_input.c",
    "lines": "767-778",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L767-L778"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_menu.c",
    "lines": "410-415",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_menu.c#L410-L415"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/fm1backup.js",
    "lines": "6-9",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/fm1backup.js#L6-L9"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/fm1backup.js",
    "lines": "63-90",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/fm1backup.js#L63-L90"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/fm1backup.js",
    "lines": "111-149",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/fm1backup.js#L111-L149"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor_backup.c",
    "lines": "34-41",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_backup.c#L34-L41"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor_backup.c",
    "lines": "91-107",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_backup.c#L91-L107"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/editor_backup.c",
    "lines": "131-141",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_backup.c#L131-L141"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/index_pkg.html",
    "lines": "248-274",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/index_pkg.html#L248-L274"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "web/fm1backup.js",
    "lines": "117-147",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/fm1backup.js#L117-L147"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/main.c",
    "lines": "232-236",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L232-L236"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ota.c",
    "lines": "396-411",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ota.c#L396-L411"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/storage.c",
    "lines": "127-138",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/storage.c#L127-L138"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "1029-1047",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1029-L1047"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/project.c",
    "lines": "1137-1158",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/project.c#L1137-L1158"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "172-183",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L172-L183"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/ui_input.c",
    "lines": "1464-1467",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/ui_input.c#L1464-L1467"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/main.c",
    "lines": "274-276",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L274-L276"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/upreset.c",
    "lines": "41-73",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L41-L73"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/upreset.c",
    "lines": "96-114",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L96-L114"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/upreset.c",
    "lines": "241-246",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L241-L246"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/upreset.c",
    "lines": "257-292",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/upreset.c#L257-L292"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "66",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L66"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "86-106",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L86-L106"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "110-145",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L110-L145"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "172-183",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L172-L183"
   },
   {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/up_fm6.c",
    "lines": "206-213",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/up_fm6.c#L206-L213"
   }
  ],
  "grade": "read-in-source",
  "automatic_settings_writes": "In full Felucca, first opening a quick layer saves its seen-hint flag. Changing the REC layer’s choices saves them when the layer closes; marking favourites or changing the FAV filter also requests a settings save. Closing MENU requests a save even without an edit; the write is skipped only when the resulting settings match the loaded or last-saved copy. If no settings could be read, the first menu close can therefore write a new settings record. These operations rewrite the whole settings record without asking, wait while playback runs, and cannot be reversed with UNDO.",
  "restore_scope": "A complete archive lists all four saved projects, both user-sound banks and all three sample slots, including empty ones. Restoring an empty project, sound bank or sample slot clears the corresponding saved item on the unit; it does not keep newer work that was absent from that backup. An empty attached-patch entry clears those attached FM6 patches. The browser rejects an archive with arbitrarily missing items before writing anything. Supported older archives can omit the later FM6 patch entries: an omitted entry is not written or erased, although restored sound records may stop matching the patches left on the unit. The separate working-session autosave and hand-set SLICE markers are not part of this restore.",
  "other_work_at_risk": [
   "Back up using the firmware that made the work BEFORE Rainbow’s first start; waiting to save in Rainbow is not sufficient protection.",
   "At every start Rainbow checks the update area and, if its probes find data, erases that area without asking. See the switching advice in this section for the affected saved work.",
   "See the switching advice in this section for the affected saved work. Triggers include a child’s WRITE or grown-ups’ setting, first quick-layer use, MENU close, calibration, or a settings/name send from the computer. These writes ask no question, wait while playback runs, and skip the flash write only if the stored settings would be unchanged.",
   "In particular, WRITE saves can alter Felucca 1.6.1’s custom palette, idle animation, preset-list category, FX-key assignments and some menu choices; changing Rainbow’s volume ceiling or look-alikes choice can alter that version’s HOME view.",
   "See the switching advice in this section for the affected saved work. Unreadable slots get no overwrite question, and computer sends have no question on the unit.",
   "Saving, renaming, erasing or sending a user sound can rewrite its whole sound bank. See the switching advice in this section for the affected saved work. A sound save into an empty-looking slot asks nothing about those other contents; computer writes ask no question on the unit. Rainbow cannot read Melodee’s user-sound banks, so their slots look empty; its first sound save or send writes its own sixteen-slot bank over the Melodee bank without an overwrite question.",
   "The first full-Felucca autosave after a music edit writes without asking. See the switching advice in this section for the affected saved work. It runs only with RESTORE LAST on after the stopped, quiet interval described above; the toy does not run this music autosave.",
   "An FM6 user-sound save or patch send writes its patch storage. See the switching advice in this section for the affected saved work. Compatible attached FM6 patch banks from other Felucca-family firmwares are read: a normal slot save changes that slot’s patch entry while carrying the other entries forward. A carried patch plays only while its matching user-sound record still matches. If no readable attached-patch bank exists, a surviving compatible older FM6 bank can also trigger an automatic conversion and write at start-up, without asking.",
   "Sample sends, erases and restores from the editor write their selected sample space. See the switching advice in this section for the affected saved work. Automatic saving of changed SLICE markers can also overwrite overlapping work in a sample’s free tail. These writes have no question on the unit.",
   "See the switching advice in this section for the affected saved work. Baud Girl’s exact preset and pattern locations are not verified, so preservation cannot be promised; back up those sounds and patterns in Baud Girl before switching."
  ],
  "overwrites_previous": [
   {
    "from": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "stock settings (and possibly patterns)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Baud Girl presets (128)",
     "Baud Girl patterns (16, with locks)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       }
      ]
     },
     {
      "object": "the autosave (the music as you left it)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches of the FM6 user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "project slot A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project slot D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user presets 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads FM6 patches of the FM6 user presets until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR1 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR2 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings, button calibration, favourites, MIDI LEARN map. At risk by itself, under a condition: the autosave (the music as you left it); FM6 patches of the FM6 user presets. At risk when you act: project slot A; project slot B; project slot C; project slot D; user presets 1-16; user presets 17-32; user sample slot USR1; user sample slot USR2; user sample slot USR3. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads FM6 patches of the FM6 user presets until you write over the saved data. Rainbow Mode reads user sample slot USR1 until you write over the saved data. Rainbow Mode reads user sample slot USR2 until you write over the saved data. Rainbow Mode reads user sample slot USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patch bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the music in progress (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads user sample slot USR1 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR2 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk by itself, under a condition: FM6 patch bank B1-B27. At risk when you act: song section A (a whole project); song section B (a whole project); song section C (a whole project); song section D (a whole project); the music in progress (autosave); user sounds U01-U16; user sounds U17-U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. Rainbow Mode reads user sample slot USR1 until you write over the saved data. Rainbow Mode reads user sample slot USR2 until you write over the saved data. Rainbow Mode reads user sample slot USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "break loops slot 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads break loops slot 1 until you write over the saved data.",
     "Rainbow Mode reads break loops slot 2 until you write over the saved data.",
     "Rainbow Mode reads break loops slot 3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: the whole X0X project (settings, sound, all 32 patterns, song, knob motion). At risk when you act: X0X button calibration; break loops slot 1; break loops slot 2; break loops slot 3. Rainbow Mode reads break loops slot 1 until you write over the saved data. Rainbow Mode reads break loops slot 2 until you write over the saved data. Rainbow Mode reads break loops slot 3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for the FM6 user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "song 1 section A (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section B (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section C (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 1 section D (a whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 2: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 3: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "song 5: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8: four sections (whole projects)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "which song is current, every song's rows and scenes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "JIANT’s default RESTORE LAST OFF turns automatic saving on here. A saved JIANT ON choice turns it off here because the setting has the opposite meaning.",
     "Rainbow Mode reads FM6 patches for the FM6 user sounds until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings, calibration, favourites, MENU options. At risk by itself, under a condition: music in progress (RESTORE LAST); FM6 patches for the FM6 user sounds. At risk when you act: song 1 section A (a whole project); song 1 section B (a whole project); song 1 section C (a whole project); song 1 section D (a whole project); song 2: four sections (whole projects); song 3: four sections (whole projects); song 4: four sections (whole projects); song 5: four sections (whole projects); song 6: four sections (whole projects); song 7: four sections (whole projects); song 8: four sections (whole projects); which song is current, every song's rows and scenes; user sounds U01-U16; user sounds U17-U32. JIANT’s default RESTORE LAST OFF turns automatic saving on here. A saved JIANT ON choice turns it off here because the setting has the opposite meaning. Rainbow Mode reads FM6 patches for the FM6 user sounds until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U037-U054",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U289-U378",
      "effect": "partly lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "shared user presets U379-U384",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U109-U126",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project A: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D: patterns, song, sounds, motion, recordings",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U145-U288",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U073-U090",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U091-U108",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U019-U036",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, factory favourites, calibration, saved template. At risk by itself, under a condition: shared user presets U037-U054. At risk when you act: shared user presets U289-U378 (partly lost); shared user presets U379-U384; shared user presets U109-U126; project A: patterns, song, sounds, motion, recordings; project B: patterns, song, sounds, motion, recordings; project C: patterns, song, sounds, motion, recordings; project D: patterns, song, sounds, motion, recordings; shared user presets U145-U288; shared user presets U073-U090; shared user presets U091-U108; shared user presets U001-U018; shared user presets U019-U036.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FoMni button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). At risk when you act: FoMni button calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "AMB-1 panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. At risk when you act: AMB-1 panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "32 imported DX7 voices",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank A (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank B (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank C (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank D (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank E (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank F (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank G (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "CZ-1 bank H (16 tones)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last session saved with a global save",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "favourite marks, chord/bass type and filter",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "128 saved sounds with their complete engine patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "recorded loop 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration. At risk when you act: 32 imported DX7 voices; CZ-1 bank A (16 tones); CZ-1 bank B (16 tones); CZ-1 bank C (16 tones); CZ-1 bank D (16 tones); CZ-1 bank E (16 tones); CZ-1 bank F (16 tones); CZ-1 bank G (16 tones); CZ-1 bank H (16 tones); last session saved with a global save; favourite marks, chord/bass type and filter; 128 saved sounds with their complete engine patches; recorded loop 1; recorded loop 2; recorded loop 3; recorded loop 4; recorded loop 5; recorded loop 6; recorded loop 7; recorded loop 8; recorded loop 9; recorded loop 10.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       }
      ]
     },
     {
      "object": "music in progress (RESTORE LAST)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches for user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its preset bank]",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads FM6 patches for user sounds until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR1 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR2 until you write over the saved data.",
     "Rainbow Mode reads user sample slot USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings and panel calibration. At risk by itself, under a condition: music in progress (RESTORE LAST); FM6 patches for user sounds. At risk when you act: project A; project B; project C; project D; user sounds 1–16; user sounds 17–32; user sample slot USR1; user sample slot USR2; user sample slot USR3. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads FM6 patches for user sounds until you write over the saved data. Rainbow Mode reads user sample slot USR1 until you write over the saved data. Rainbow Mode reads user sample slot USR2 until you write over the saved data. Rainbow Mode reads user sample slot USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Open shared sample audio",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "automatically, only if data is left where firmware updates are prepared",
        "effect": "lost"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a firmware update",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older stored user bank, if present (Beta4 does not store new edits)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences. At risk when you act: older stored user bank, if present (Beta4 does not store new edits).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed to the new format: The next settings save, even an automatic save during use, makes Hortator start with default settings and panel calibration and no remembered Bluetooth device when you return. Back them up before switching"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads user samples USR1 until you write over the saved data.",
     "Rainbow Mode reads user samples USR2 until you write over the saved data.",
     "Rainbow Mode reads user samples USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings and panel calibration. At risk when you act: project A; project B; project C; project D; user samples USR1; user samples USR2; user samples USR3. Rainbow Mode reads user samples USR1 until you write over the saved data. Rainbow Mode reads user samples USR2 until you write over the saved data. Rainbow Mode reads user samples USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "pattern 1",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 2",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 3",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 4",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 5",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 6",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 7",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     },
     {
      "object": "pattern 8",
      "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain",
      "ways": [
       {
        "way": "automatically during use [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its saved B-track program]",
        "effect": "its B-track sound can change if it uses a saved program; its pattern notes remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: saved programs and global settings; pattern 1 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 2 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 3 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 4 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 5 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 6 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 7 (its B-track sound can change if it uses a saved program; its pattern notes remain); pattern 8 (its B-track sound can change if it uses a saved program; its pattern notes remain).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "polly",
    "name": "Polly",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Optional QY70 style bank",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "All four Polly songs",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly shared memory 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Polly button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. At risk by itself, under a condition: Optional QY70 style bank. At risk when you act: All four Polly songs; Polly shared memory 1; Polly shared memory 2; Polly shared memory 3; Polly shared memory 4; Polly shared memory 5; Polly shared memory 6; Polly shared memory 7; Polly shared memory 8; Polly shared memory 9; Polly shared memory 10; Polly shared memory 11; Polly shared memory 12; Polly shared memory 13; Polly shared memory 14; Polly shared memory 15; Polly shared memory 16; Polly button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed automatically: Loading settings adjusts the display style, recording options, screen timeout and volume, and clears favourites for user sounds it cannot read. Saving the WRITE song also uses settings space that other firmware may use for its own options. Saving settings or WRITE saves all settings together"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sound bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its separate FM6 patch collection]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format when read; saved in that format next time you save this bank"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "last session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds’ own FM6 patches",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads user sounds’ own FM6 patches until you write over the saved data.",
     "Rainbow Mode reads user sample USR1 until you write over the saved data.",
     "Rainbow Mode reads user sample USR2 until you write over the saved data.",
     "Rainbow Mode reads user sample USR3 until you write over the saved data."
    ],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk by itself, under a condition: user sound bank 1 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sound bank 2 (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); last session; user sounds’ own FM6 patches. At risk when you act: project A; project B; project C; project D; user sample USR1; user sample USR2; user sample USR3. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads user sounds’ own FM6 patches until you write over the saved data. Rainbow Mode reads user sample USR1 until you write over the saved data. Rainbow Mode reads user sample USR2 until you write over the saved data. Rainbow Mode reads user sample USR3 until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopdx",
    "name": "sloopDX",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, MIDI, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices and drum kit]",
        "effect": "sounds can change if their saved DX7 voices, chosen bank or drum kit are replaced; saved notes and controls stay"
       }
      ]
     },
     {
      "object": "DX7 bank 1 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 1 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 2 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 3 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 4 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 5 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 6 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 7 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "DX7 bank 8 voices 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "selected DX7 bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "MY KIT",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
     },
     {
      "object": "user presets 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its saved DX7 voices]",
        "effect": "sounds can change if their saved DX7 voices or chosen bank are replaced; saved notes and controls stay"
       }
      ],
      "first_way_effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings, calibration, song order, MIDI, theme and favourites. At risk when you act: section A; section B; section C; section D; working loop; DX7 bank 1 voices 1–16; DX7 bank 1 voices 17–32; DX7 bank 2 voices 1–16; DX7 bank 2 voices 17–32; DX7 bank 3 voices 1–16; DX7 bank 3 voices 17–32; DX7 bank 4 voices 1–16; DX7 bank 4 voices 17–32; DX7 bank 5 voices 1–16; DX7 bank 5 voices 17–32; DX7 bank 6 voices 1–16; DX7 bank 6 voices 17–32; DX7 bank 7 voices 1–16; DX7 bank 7 voices 17–32; DX7 bank 8 voices 1–16; DX7 bank 8 voices 17–32; selected DX7 bank; MY KIT; user presets 1–16 (changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; other writes can also erase it); user presets 17–32 (changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS; other writes can also erase it).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "duell",
    "name": "DUELL beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "last working music",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M01–M02",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M03–M04",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M05–M06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M07–M08",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved patches",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user wavetable USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M09–M10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M11–M12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M13–M14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "multis M15–M16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P01–P06",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P07–P12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "patterns P13–P16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after DUELL, even if you turned it OFF before. DUELL saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave."
    ],
    "owner_text": "At risk by itself: settings and panel setup. At risk by itself, under a condition: last working music. At risk when you act: multis M01–M02; multis M03–M04; multis M05–M06; multis M07–M08; saved patches; user wavetable USR1; user wavetable USR2; user wavetable USR3; multis M09–M10; multis M11–M12; multis M13–M14; multis M15–M16; patterns P01–P06; patterns P07–P12; patterns P13–P16. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after DUELL, even if you turned it OFF before. DUELL saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fimba",
    "name": "FiMba-1 beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FiMba-1 beta sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FiMba-1 beta panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FiMba-1 beta sound and playing setup. At risk when you act: FiMba-1 beta panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "maku",
    "name": "MAKU",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed to the new format: Rainbow keeps its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change them, so not all of them survive a return to Rainbow. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "up to sixteen liked worlds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "inherited project A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited project D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user sample 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "inherited user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads inherited FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "Rainbow Mode reads inherited user sample 1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads inherited user sample 2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads inherited user sample 3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads inherited user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. MAKU’s insert controls become timing and modulation controls in Felucca. Earlier firmware ignores them. The insert sound is not kept.",
     "Rainbow Mode reads inherited user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. MAKU’s insert controls become timing and modulation controls in Felucca. Earlier firmware ignores them. The insert sound is not kept."
    ],
    "owner_text": "At risk by itself: settings and calibration. At risk by itself, under a condition: up to sixteen liked worlds; inherited FM6 patches for user presets. At risk when you act: inherited project A; inherited project B; inherited project C; inherited project D; inherited user sample 1; inherited user sample 2; inherited user sample 3; inherited user preset bank 1; inherited user preset bank 2. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads inherited FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. Rainbow Mode reads inherited user sample 1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads inherited user sample 2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads inherited user sample 3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads inherited user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. MAKU’s insert controls become timing and modulation controls in Felucca. Earlier firmware ignores them. The insert sound is not kept. Rainbow Mode reads inherited user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. MAKU’s insert controls become timing and modulation controls in Felucca. Earlier firmware ignores them. The insert sound is not kept.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "learned button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: learned button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "chord",
    "name": "fm1-chord",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration, four chord preset setups and the current chord setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you saved an FM6 bank in fm1-chord and no older bank of FM6 patches for your sounds from another firmware remains",
        "effect": "changed to the new format: Later saves of user-sound patches can erase fm1-chord’s FM6 bank. When you return, fm1-chord cannot use patches saved in the new format. If a valid bank of FM6 patches for your sounds from another firmware remains, the older bank is not changed to the new format at start-up"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves of user-sound patches can erase fm1-chord’s FM6 bank. When you return, fm1-chord cannot use patches saved in the new format. If a valid bank of FM6 patches for your sounds from another firmware remains, the older bank is not changed to the new format at start-up"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves of user-sound patches can erase fm1-chord’s FM6 bank. When you return, fm1-chord cannot use patches saved in the new format. If a valid bank of FM6 patches for your sounds from another firmware remains, the older bank is not changed to the new format at start-up"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves of user-sound patches can erase fm1-chord’s FM6 bank. When you return, fm1-chord cannot use patches saved in the new format. If a valid bank of FM6 patches for your sounds from another firmware remains, the older bank is not changed to the new format at start-up"
       }
      ]
     },
     {
      "object": "chord preset P1: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P2: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P3: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "chord preset P4: full synth project",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR1 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR2 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "uploaded sample USR3 and optional SLICE markers",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "user sounds 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sounds 1-16 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. The other firmware’s extra instrument is unavailable here. Its sounds appear empty.",
     "Rainbow Mode reads user sounds 17-32 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. The other firmware’s extra instrument is unavailable here. Its sounds appear empty."
    ],
    "owner_text": "At risk by itself: settings, panel calibration, four chord preset setups and the current chord setup. At risk by itself, under a condition: FM6 bank B1-B27. At risk when you act: chord preset P1: full synth project; chord preset P2: full synth project; chord preset P3: full synth project; chord preset P4: full synth project; uploaded sample USR1 and optional SLICE markers; uploaded sample USR2 and optional SLICE markers; uploaded sample USR3 and optional SLICE markers; user sounds 1-16; user sounds 17-32. Rainbow Mode reads uploaded sample USR1 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads uploaded sample USR2 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads uploaded sample USR3 and optional SLICE markers until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sounds 1-16 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. The other firmware’s extra instrument is unavailable here. Its sounds appear empty. Rainbow Mode reads user sounds 17-32 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. The other firmware’s extra instrument is unavailable here. Its sounds appear empty.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, synthesized drum kits and DX-bank setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 patches B1–B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working loop",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After Rainbow Mode replaces DX7 Banks’ saved settings, returning to DX7 Banks erases DX banks 1–8 at its first start without asking, including your own banks 5–8. Back up your DX banks before switching.",
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after SLOOP DX7 Banks, even if you turned it OFF before. SLOOP DX7 Banks saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
     "Rainbow Mode reads user sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, calibration, song order, synthesized drum kits and DX-bank setup. At risk by itself, under a condition: FM6 patches B1–B27. At risk when you act: section A; section B; section C; section D; working loop; user sounds 1–16; user sounds 17–32; user sample USR1; user sample USR2; user sample USR3. After Rainbow Mode replaces DX7 Banks’ saved settings, returning to DX7 Banks erases DX banks 1–8 at its first start without asking, including your own banks 5–8. Back up your DX banks before switching. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after SLOOP DX7 Banks, even if you turned it OFF before. SLOOP DX7 Banks saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave. Rainbow Mode reads user sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fumi",
    "name": "FuMi-1",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jangada",
    "name": "Jangada",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, calibration and MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 voices B1-B16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user samples USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after Jangada, even if you turned it OFF before. Jangada saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
     "Rainbow Mode reads user samples USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user samples USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user samples USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate."
    ],
    "owner_text": "At risk by itself: preferences, calibration and MIDI LEARN map. At risk by itself, under a condition: FM6 voices B1-B16. At risk when you act: project 1; project 2; project 3; project 4; working music (autosave); user sounds U01-U16; user sounds U17-U32; user samples USR1; user samples USR2; user samples USR3. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after Jangada, even if you turned it OFF before. Jangada saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave. Rainbow Mode reads user samples USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user samples USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user samples USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "FM6 patches and controls for each drum in user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "song 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       }
      ]
     },
     {
      "object": "song 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       }
      ]
     },
     {
      "object": "song 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       }
      ]
     },
     {
      "object": "last session saved for the next start",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens. WaveLoop DRUM uses its stored FM6 patch differently. The page and chosen song from WaveLoop’s automatically saved session are not restored here"
       }
      ]
     },
     {
      "object": "slice positions you set for USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions you set for USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song order and selection",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "user sounds 17–32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads FM6 patches and controls for each drum in user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. WaveLoop also saves patches with DRUM sounds. Other firmware does not use them as WaveLoop drum patches.",
     "Rainbow Mode reads user sample USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sounds 1–16 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Rainbow Mode reads user sounds 17–32 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question."
    ],
    "owner_text": "At risk by itself: settings, calibration and favourites. At risk by itself, under a condition: FM6 patches and controls for each drum in user sounds. At risk when you act: song 1; song 2; song 3; last session saved for the next start; slice positions you set for USR1; slice positions you set for USR2; song 4; song 5; song 6; song 7; song 8; song 9; song 10; song 11; song 12; song order and selection; user sample USR1; user sample USR2; user sounds 1–16; user sounds 17–32. Rainbow Mode reads FM6 patches and controls for each drum in user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. WaveLoop also saves patches with DRUM sounds. Other firmware does not use them as WaveLoop drum patches. Rainbow Mode reads user sample USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sounds 1–16 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Rainbow Mode reads user sounds 17–32 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "orbit",
    "name": "ORBIT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved section A",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section B",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section C",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "saved section D",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "USER sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "USER sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ],
      "first_way_effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
     },
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after ORBIT, even if you turned it OFF before. ORBIT saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
     "Rainbow Mode reads sample slot USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads sample slot USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads sample slot USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate."
    ],
    "owner_text": "At risk by itself: saved section A (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section B (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section C (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); saved section D (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); working music kept by autosave (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences. At risk by itself, under a condition: USER sounds U01-U16 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); USER sounds U17-U32 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain; other writes can also erase it); FM6 bank B1-B27. At risk when you act: sample slot USR1; sample slot USR2; sample slot USR3. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after ORBIT, even if you turned it OFF before. ORBIT saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave. Rainbow Mode reads sample slot USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads sample slot USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads sample slot USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the working loop kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, panel calibration and song order. At risk when you act: song section A; song section B; song section C; song section D; the working loop kept by autosave; user sounds U01–U16; user sounds U17–U32; user sample slot USR1; user sample slot USR2; user sample slot USR3. Rainbow Mode reads user sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads user sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "winampfm",
    "name": "winampFM Synth",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration, song order, SYN kits and MIDI",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM6 bank B1-B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section A (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section B (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section C (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "section D (whole project)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music kept by autosave",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds 17-32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after winampFM, even if you turned it OFF before. winampFM saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
     "Rainbow Mode reads sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads sample USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads sample USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, panel calibration, song order, SYN kits and MIDI. At risk by itself, under a condition: FM6 bank B1-B27. At risk when you act: section A (whole project); section B (whole project); section C (whole project); section D (whole project); working music kept by autosave; user sounds 1-16; user sounds 17-32; sample USR1; sample USR2; sample USR3. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after winampFM, even if you turned it OFF before. winampFM saves its own settings at several points, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave. Rainbow Mode reads sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads sample USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads sample USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "sixteen six-track patterns",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "song order and four scenes",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "eight saved sampler takes",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "twelve uploaded sounds or DX7 banks",
      "effect": "some or all lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "some or all lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "some or all lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "some or all lost"
       }
      ]
     },
     {
      "object": "screen language pack",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "system preferences and last pattern",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: sixteen six-track patterns (some or all lost); song order and four scenes (some or all lost); eight saved sampler takes (some or all lost); twelve uploaded sounds or DX7 banks (some or all lost); screen language pack; system preferences and last pattern.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "salt",
    "name": "Felucca [Salt]",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "screen preferences, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       }
      ]
     },
     {
      "object": "user sounds U17-U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next bank save keeps older drum sounds in their new format. New sounds and sounds you replace directly use versions Salt cannot read. Sounds this firmware cannot use stay stored unchanged until replaced. Salt’s DRAWBAR sounds use the instrument number this firmware uses for WHEEL, so they play as a different instrument. Saving also keeps the format changes made to the bank when it loaded"
       }
      ]
     },
     {
      "object": "user sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads user sample USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate."
    ],
    "owner_text": "At risk by itself: screen preferences, calibration and favourites. At risk when you act: project 1; project 2; project 3; project 4; user sounds U01-U16; user sounds U17-U32; user sample USR1; user sample USR2; user sample USR3. Rainbow Mode reads user sample USR1 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR2 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR3 until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "pigeon",
    "name": "PIGEON",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "changed to the new format: Saving a WRITE song in Rainbow replaces PIGEON’s MIDI LEARN assignments. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "the older FM6 patch bank PIGEON no longer uses",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "last working session",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older FM6 patches for user presets",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you install Rainbow Mode",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved pattern D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "slice positions set by hand in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "partly lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "partly lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "partly lost"
       }
      ]
     },
     {
      "object": "chops, drum-pad and performance edits",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR1 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR2 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sample USR3 in the older format",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     },
     {
      "object": "older user preset bank 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving.",
     "Rainbow Mode reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "Rainbow Mode reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Rainbow Mode reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Rainbow Mode reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk by itself, under a condition: the older FM6 patch bank PIGEON no longer uses; last working session; older FM6 patches for user presets. At risk when you act: shared song and drum sample bank; saved pattern A; saved pattern B; saved pattern C; saved pattern D; slice positions set by hand in the older format; chops, drum-pad and performance edits; user sample USR1 in the older format; user sample USR2 in the older format; user sample USR3 in the older format; older user preset bank 1; older user preset bank 2. These shared settings leave RESTORE LAST on by default. A saved OFF choice stops automatic saving. Rainbow Mode reads older FM6 patches for user presets until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. Rainbow Mode reads user sample USR1 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR2 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads user sample USR3 in the older format until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Rainbow Mode reads older user preset bank 1 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Rainbow Mode reads older user preset bank 2 until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1move",
    "name": "FM1 Move",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, SYN kits and stored MIDI mappings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "project 1",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "project 2",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "the working project kept by autosave",
      "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain",
      "ways": [
       {
        "way": "automatically during use [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you edit sample slice markers (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you run hardware calibration (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you send settings or a name from the editor (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking) [uses its separate samples or sound setup]",
        "effect": "sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain"
       }
      ]
     },
     {
      "object": "FM6 bank B1–B27",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if you open the full version of Felucca by holding HOME + SAVE for 3 seconds and its RESTORE LAST is on (the default)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "sample slot USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample slot USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The full Felucca in Rainbow Mode may start with RESTORE LAST ON after FM1 Move, even if you turned it OFF before. FM1 Move can save its own settings, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave.",
     "Rainbow Mode reads sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
     "Rainbow Mode reads sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different."
    ],
    "owner_text": "At risk by itself: settings, calibration, SYN kits and stored MIDI mappings; project 1 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain); project 2 (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain); the working project kept by autosave (sounds can change or stop playing when separate samples, FM6 patches or SYN kits are replaced; saved notes and sound settings remain). At risk by itself, under a condition: FM6 bank B1–B27. At risk when you act: user sounds U01–U16; user sounds U17–U32; sample slot USR1; sample slot USR2; sample slot USR3. The full Felucca in Rainbow Mode may start with RESTORE LAST ON after FM1 Move, even if you turned it OFF before. FM1 Move can save its own settings, replacing the earlier settings with ones the full Felucca in Rainbow Mode cannot read; an older choice saved by another firmware can also mean the opposite here. Check MENU > SYSTEM > RESTORE LAST in the full Felucca layer before you edit. ON allows automatic saving after edits and a pause with playback stopped, keys and buttons released, and no sound; OFF stops that autosave. Rainbow Mode reads sample slot USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads sample slot USR2 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Rainbow Mode reads sample slot USR3 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel mapping, song order and Quest preferences/progress",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a greeting name was entered in the installer",
        "effect": "lost"
       },
       {
        "way": "when you change Rainbow preferences or save its greeting name (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or a name from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section A",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section B",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section C",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "song section D",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "working music (autosave)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "sample USR3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Piano Hero P6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FM Hero H6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "user sounds U17–U32",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: The next save, rename or erase in this bank saves the older sounds in the new format. They can change when you return to the previous firmware. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Some sounds play as a different instrument: SLOOP FM6 and Floyd sounds can become PHYS, SLOOP FM6 sounds using algorithm 4 can become DRUM, SLOOPDX sounds become ANALOG, and Quest SLICE sounds can become PHYS"
       }
      ]
     },
     {
      "object": "sample USR1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow Mode reads sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Only the first sample is stored in the same place. The other two sample slots use different storage."
    ],
    "owner_text": "At risk by itself: settings, panel mapping, song order and Quest preferences/progress. At risk when you act: song section A; song section B; song section C; song section D; working music (autosave); sample USR2; sample USR3; Piano Hero P1; Piano Hero P2; Piano Hero P3; Piano Hero P4; Piano Hero P5; Piano Hero P6; FM Hero H1; FM Hero H2; FM Hero H3; FM Hero H4; FM Hero H5; FM Hero H6; user sounds U01–U16; user sounds U17–U32; sample USR1. Rainbow Mode reads sample USR1 until you write over the saved data. Playback follows this firmware’s loop rules. The other firmware’s extra loop modes may sound different. Only the first sample is stored in the same place. The other two sample slots use different storage.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "Groove project slot 1",
     "Groove project slot 2",
     "Groove project slot 3",
     "Groove resume autosave",
     "Groove sound bank A",
     "Groove sound bank B",
     "Groove sound bank C",
     "Groove sound bank D",
     "Groove custom drum sounds and kits",
     "Groove device preferences",
     "Groove crash reports"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Groove OS does not publish where or how it stores saved work, so data may be lost even where we cannot confirm shared storage. Before switching, use export all on its Projects page to save every project and the autosave. Use Save a backup on Your own sounds too: project exports remember the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, autosave and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): Groove project slot 1; Groove project slot 2; Groove project slot 3; Groove resume autosave; Groove sound bank A; Groove sound bank B; Groove sound bank C; Groove sound bank D; Groove custom drum sounds and kits; Groove device preferences; Groove crash reports. Groove OS does not publish where or how it stores saved work, so data may be lost even where we cannot confirm shared storage. Before switching, use export all on its Projects page to save every project and the autosave. Use Save a backup on Your own sounds too: project exports remember the sounds but leave out the audio. Use Save a safety copy on Your FM-1 for the banks, songs, autosave and samples. Keep these files on your computer. Sound banks, custom sounds, settings and crash reports may be lost.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ],
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "Project A: four tracks and their sounds, notes, automation, song chain and name",
     "Project B: four tracks and their sounds, notes, automation, song chain and name",
     "Project C: four tracks and their sounds, notes, automation, song chain and name",
     "Project D: four tracks and their sounds, notes, automation, song chain and name",
     "the FM6 patches used by the thirty-two user sounds",
     "your old FM6 bank (B1–B27)",
     "User sample USR1 and any slice positions you set in SLICE",
     "User sample USR2 and any slice positions you set in SLICE",
     "User sample USR3 and any slice positions you set in SLICE",
     "user sounds U01–U16, names and sixteen-step patterns without automation",
     "user sounds U17–U32, names and sixteen-step patterns without automation",
     "the last session in the full version of Felucca"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; the last session in the full version of Felucca.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "baudgirl",
    "name": "Baud Girl FM-1+VA",
    "flags": "?",
    "weakest_grade": "inferred",
    "at_risk": [],
    "possibly_at_risk": [
     "Project A: four tracks and their sounds, notes, automation, song chain and name",
     "Project B: four tracks and their sounds, notes, automation, song chain and name",
     "Project C: four tracks and their sounds, notes, automation, song chain and name",
     "Project D: four tracks and their sounds, notes, automation, song chain and name",
     "the FM6 patches used by the thirty-two user sounds",
     "your old FM6 bank (B1–B27)",
     "User sample USR1 and any slice positions you set in SLICE",
     "User sample USR2 and any slice positions you set in SLICE",
     "User sample USR3 and any slice positions you set in SLICE",
     "user sounds U01–U16, names and sixteen-step patterns without automation",
     "user sounds U17–U32, names and sixteen-step patterns without automation",
     "the last session in the full version of Felucca"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; the last session in the full version of Felucca.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you send an FM6 voice bank with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "automatically, only if beta 2ND CORE is on and a sound calculation fails or takes too long",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change settings from the editor (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you learn MIDI CC assignments (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no valid current bank of FM6 patches for your sounds [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: Saving this project here uses this firmware’s format. The previous firmware may no longer read it. Save a separate backup before changing its format. Playback uses this firmware’s instruments and control meanings. Saved music may sound different even if it opens"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you change slice positions in SLICE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Rainbow shares the saved RESTORE LAST choice with this firmware. WRITE does not change that choice because it ends before where the choice is stored. A saved OFF choice stops automatic saving here. Otherwise, music is saved automatically after edits and a wait with playback stopped, no held keys or buttons and no sound.",
     "Shared settings can keep beta 2ND CORE turned on from an earlier Felucca session. If a sound calculation fails or takes too long, settings may be saved later.",
     "Felucca reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "Felucca reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate.",
     "Felucca reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "Felucca reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question."
    ],
    "owner_text": "At risk by itself: the last session in the full version of Felucca; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: your old FM6 bank (B1–B27); the FM6 patches used by the thirty-two user sounds; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. Rainbow shares the saved RESTORE LAST choice with this firmware. WRITE does not change that choice because it ends before where the choice is stored. A saved OFF choice stops automatic saving here. Otherwise, music is saved automatically after edits and a wait with playback stopped, no held keys or buttons and no sound. Shared settings can keep beta 2ND CORE turned on from an earlier Felucca session. If a sound calculation fails or takes too long, settings may be saved later. Felucca reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. Felucca reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Only data in this sample slot is read. Other saved work is separate. Felucca reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. Felucca reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start an update or enter UPDATE MODE",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start an update or enter UPDATE MODE",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if SLOOP can still read older SLOOP settings with default MIDI controls and older working music whose drum MIDI channel differs from those settings (Rainbow Mode’s own settings cannot trigger this update)",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save drum kits from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or remove a theme from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the song from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you start an update or enter UPDATE MODE [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you start an update or enter UPDATE MODE [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold SAVE and press white key 5–8 to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you load a song file from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you load a song from the editor LIVE playlist (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section from the web editor LIVE page (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it.",
     "SLOOP keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. SLOOP reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. SLOOP keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if X0X crashed while 2ND CORE was on and then restarted without being switched off",
        "effect": "lost"
       },
       {
        "way": "when you back up unsaved project changes over USB (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you reset to factory settings (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup over USB with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you upload samples or break loops (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed.",
     "X0X reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
     "X0X reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
     "X0X reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used."
    ],
    "owner_text": "At risk by itself: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; user sounds U17–U32, names and sixteen-step patterns without automation; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. After you confirm a restore on the computer, X0X starts erasing before asking again on the FM-1. Saying no keeps X0X’s current project but does not bring back erased data from your previous firmware, even if the computer says nothing changed. X0X reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. X0X reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used. X0X reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Each zone plays as a separate repeating break loop (up to 16 per sample). Key ranges, root notes, loop points and slice markers are not used.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you select a song using MIDI PROGRAM CHANGE (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you switch song or project (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "automatically, only if the shared preferences it reads still need JIANT’s first-start update",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its associated sound bank]",
        "effect": "changed to the new format: Saving, erasing or renaming anything in the sound bank saves the changed sounds. They still cannot use their own FM6 patches when you return to your previous firmware. JIANT changes saved sounds when it loads them, so they stop using their own FM6 patches. They use a factory patch or the initial voice instead"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a slot (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send an FM6 user sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 sound from the web editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the shared choices it reads, or your later choice, turn JIANT’s RESTORE LAST on",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you send an FM6 voice bank from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you rename a slot (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format. JIANT no longer has SAMPLE, GRAIN, SLICE or PHYS. Those sounds use its initial ANALOG sound, except old drum and percussion sounds, which become DRUM sounds. Imported names and patterns do not mean the original sample audio or sound is kept"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you make a song with several sections using GEN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you store a section (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If RESTORE LAST was OFF before switching, it becomes ON in JIANT. The previous firmware’s default ON becomes OFF."
    ],
    "owner_text": "At risk by itself: User sample USR3 and any slice positions you set in SLICE; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); the last session in the full version of Felucca. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE. If RESTORE LAST was OFF before switching, it becomes ON in JIANT. The previous firmware’s default ON becomes OFF.",
    "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": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change a setting on the panel or in the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you mark a favourite with a star (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a template (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a matching saved preset bank needs repair or a change of format, or changing older Prophet sounds to the new format needs extra storage space",
        "effect": "lost"
       },
       {
        "way": "automatically, only if erasing all user presets was confirmed earlier but stopped before it finished",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing all user presets to recover from a problem (asks first: press the button to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you import SysEx sound data into slots (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store the current sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you quick-save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; User sample USR3 and any slice positions you set in SLICE; the last session in the full version of Felucca. At risk when you act: User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE.",
    "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": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation.",
    "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": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot favourites save is still stored and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if an older ChoralRoot session save is still stored and the space for its next save still contains data",
        "effect": "lost"
       },
       {
        "way": "automatically, only if an older ChoralRoot sound collection is still saved and the space for its next save still contains data",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if the space for its next save still needs clearing after a save or a failed start-up cleanup",
        "effect": "lost"
       },
       {
        "way": "automatically, only if there is no saved sound collection and at least one supported older user sound can be read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Import 0.21 sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Overwrite or Save as new and press OCT+ or SAVE (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Place all from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you choose a voice from a DX7 or CZ bank on the installer page and import it (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion or reset with OCT+ (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete a sound with the computer tool (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete all user sounds or reset sounds to factory defaults from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you delete selected sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you import a Digitone sound from the installer page (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound file or one DX7 or CZ voice from the installer page (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer question skipped (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you import a sound or a DX7 or CZ voice with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you move or swap sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place a sound as new or back in its saved factory position from the device manager (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you place several selected sounds from the device manager (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the device manager and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound from the installer page and enter its new name (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you rename a sound with the computer tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace a selected user sound from the device manager (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you replace factory sounds from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore factory order from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore factory presets from the device manager (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore favourite marks with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose Undo from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE after recording, editing or clearing this loop (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you place a loop from the device manager (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC in Advance mode when the current loop is not empty (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you swap loop slots from the device manager (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "automatically, only if a processor failure blocked Dual Core while its saved setting was On",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "changed to the new format: After ChoralRoot saves these settings, Rainbow Mode cannot read the newer saved copy. It uses default preferences and panel calibration when you return"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank (without asking)",
        "effect": "changed to the new format: Once ChoralRoot saves its FM6 bank, your previous firmware cannot read the new bank. It does not try the older saved copy just because the newest bank uses a different patch format. This applies only if the older 27-slot bank is still stored. A newer bank of FM6 patches in the same storage is separate and is not imported"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a DX7 bank (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the installer page, device manager or computer tool (the computer asks once before restoring the whole backup) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup with the computer question skipped (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a DX7 bank (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "ChoralRoot reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
     "ChoralRoot reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from."
    ],
    "owner_text": "At risk by itself: User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. ChoralRoot reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from. ChoralRoot reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Imported sounds may sound different, even if their names are kept. Confirming Flash Data erases the older banks they came from.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Only patches used by compatible user sounds change to the new format. Later saves take turns writing over the old bank’s two saved copies with the new bank of FM6 patches for your sounds. Back up the old bank before switching"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you send an FM6 voice bank with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you change settings from the web editor (without asking)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: A later settings save stores the changed shared choices. If you return to your previous firmware, its preferences can change even though calibration and many settings are kept"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user preset (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you rename a user preset (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving any preset in the bank also saves sounds changed to the new format when loaded. Those sounds can change when you return to your previous firmware"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if no readable bank of FM6 patches for your sounds survives and the older 27-voice FM6 bank is present",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user preset (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you rename a project (without asking)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "changed to the new format: The next project save stores the new format. Your previous firmware may then show the project as empty. It does not try an older saved copy just because it cannot read the newest project’s format"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you leave SLICES after editing slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "RESTORE LAST starts ON with the previous firmware’s fresh settings. Shared choices it reads can leave it OFF. A saved LOW click level skips the final change to ON. If CLICK was OFF or REC, an earlier change turns RESTORE LAST OFF. With CLICK ON, the previous RESTORE LAST choice stays.",
     "GHOULBOX reads the FM6 patches used by the thirty-two user sounds until you write over the saved data.",
     "GHOULBOX reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data.",
     "GHOULBOX reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data.",
     "GHOULBOX reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data."
    ],
    "owner_text": "At risk by itself: your old FM6 bank (B1–B27); the last session in the full version of Felucca; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); the FM6 patches used by the thirty-two user sounds. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. RESTORE LAST starts ON with the previous firmware’s fresh settings. Shared choices it reads can leave it OFF. A saved LOW click level skips the final change to ON. If CLICK was OFF or REC, an earlier change turns RESTORE LAST OFF. With CLICK ON, the previous RESTORE LAST choice stays. GHOULBOX reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. GHOULBOX reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. GHOULBOX reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. GHOULBOX reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open",
        "effect": "lost"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "by itself right after the Workbench installs Open [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Workbench adds Open's built-in samples right after installing it, without asking about samples. This replaces only the items marked 'by itself right after the Workbench installs Open', before you can save anything. This follows Open V12's source code; the downloaded Workbench has not been checked against it."
    ],
    "owner_text": "At risk by itself: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; the last session in the full version of Felucca; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. Workbench adds Open's built-in samples right after installing it, without asking about samples. This replaces only the items marked 'by itself right after the Workbench installs Open', before you can save anything. This follows Open V12's source code; the downloaded Workbench has not been checked against it.",
    "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": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm deletion of the active user slot (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE in the save screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you release a short SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again."
    ],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. FM-106 Beta4 does not save edited user sounds, even when it says the save worked. Export them before turning off the FM-1 or changing firmware again.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "hortator",
    "name": "Hortator",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you remember or forget a Bluetooth device (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "User sample USR1 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "User sample USR2 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)",
     "User sample USR3 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently)"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name. Carried over: User sample USR1 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); User sample USR2 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently); User sample USR3 and any slice positions you set in SLICE (Hortator uses its own one-shot sound engines, so saved loops and slices play differently).",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you tap SAVE twice outside the sequencer (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you choose COPY SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose COPY SONG (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you complete power-on hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you press SAVE (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the computer [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose COPY SONG (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy a Band groove with SAVE and a white key (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the computer [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you confirm FACTORY RESET (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm NEW SONG or FREE (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the computer",
        "effect": "lost"
       },
       {
        "way": "when you send a backup for USB restore with computer questions skipped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start a USB backup while playback is stopped, or enter a test session (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install a QY70 style bank from the computer (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a QY70 style bank directly with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed."
    ],
    "owner_text": "At risk by itself: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: User sample USR3 and any slice positions you set in SLICE; the last session in the full version of Felucca. After you agree to restore on the computer, Polly starts erasing before the FM-1 asks. Saying no on the FM-1 keeps Polly’s current project, but cannot bring back erased data from your previous firmware, even if the computer says nothing changed.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "skiff",
    "name": "Skiff",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the last session in the full version of Felucca",
      "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start, can read an older project that needs a new format and there is room to save its patterns",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "automatically, only if Skiff has not yet made its one-time settings changes",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start and has not already cleared the old scene storage",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (without asking)",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you confirm RESET SETTINGS (asks first: press again to confirm)",
        "effect": "changed automatically: Skiff can use or clear some shared preferences and save without asking. Its settings updates can replace both saved copies. Keeping calibration does not mean all saved settings survive"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you confirm a sample upload in the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you confirm erasing a sample slot (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start, can read an older project that needs a new format and there is room to save its patterns",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose RENAME in the web editor (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose SAVE AS in the web editor (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you rename a saved project (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start, can read an older project that needs a new format and there is room to save its patterns",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose RENAME in the web editor (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose SAVE AS in the web editor (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you rename a saved project (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start, can read an older project that needs a new format and there is room to save its patterns",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose RENAME in the web editor (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose SAVE AS in the web editor (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you rename a saved project (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if Skiff starts without recovering from a crash, freeze or failed start, can read an older project that needs a new format and there is room to save its patterns",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose RENAME in the web editor (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you choose SAVE AS in the web editor (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you rename a saved project (without asking)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       },
       {
        "way": "when you save a project with the web editor’s older save command (the computer asks first)",
        "effect": "changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save, import, erase or rename a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, importing, erasing or renaming any sound writes the whole bank with Skiff’s changed sounds. Your previous firmware may play changed sounds or show sounds it cannot read as empty. New Skiff sounds use a newer saved format than firmwares that accept only version 1–3. The same saved sound format does not guarantee the same sound or pattern playback"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 patch bank is still stored and no current set of FM6 patches can be loaded",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store an FM6 sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Skiff keeps the saved RESTORE LAST choice: ON allows autosave; OFF disables it.",
     "Skiff reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. A separate saved FM6 patch works only while its matching FM6 user sound is still stored.",
     "Skiff reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
     "Skiff reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
     "Skiff reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently."
    ],
    "owner_text": "At risk by itself: the last session in the full version of Felucca (changed to the new format: Once Skiff writes the converted project, returning to the previous firmware cannot load that new project copy; its surviving older copy is not a backup guarantee. This changes how the project is stored and plays. This firmware change has not been tested on an FM-1); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. At risk by itself, under a condition: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); the FM6 patches used by the thirty-two user sounds. Skiff keeps the saved RESTORE LAST choice: ON allows autosave; OFF disables it. Skiff reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. A separate saved FM6 patch works only while its matching FM6 user sound is still stored. Skiff reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently. Skiff reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently. Skiff reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Skiff uses its own sound engines, so saved loops or slices can play differently.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopdx",
    "name": "sloopDX",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save MY KIT by tapping SAVE twice from KIT or LANE (asks first: press again to confirm)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MY KIT from the web editor (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the saved input setting selects one MIDI channel rather than NOTES or CLOCK",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls at power-on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings, MIDI controls or a theme with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update or enter UPDATE MODE [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you leave a bank with unsaved voice changes and a bank is active",
        "effect": "lost"
       },
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you erase the selected bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank by tapping EDIT twice on Store (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the DX7 list (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the active bank from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a DX7 bank with a computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section and confirm it on the SECTION page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a section with SAVE and white keys 5–8 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "sloopDX keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "sloopDX keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR2 and any slice positions you set in SLICE; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk by itself, under a condition: User sample USR1 and any slice positions you set in SLICE. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name. sloopDX keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. sloopDX keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "duell",
    "name": "DUELL beta",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its RESTORE LAST is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only if loading M01 at first start changes the music and RESTORE LAST is on",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 voice bank directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change MIDI LEARN (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change USB serial settings from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you change preferences from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a user wavetable directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a user wavetable from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a multi (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a multi from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a pattern (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase all saved data (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you install DUELL with Erase saved data enabled (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a patch on the panel (asks for that slot only: press the button to confirm; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or import a patch from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send a patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send backup restore commands directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send the erase-all command directly with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase."
    ],
    "owner_text": "At risk by itself: the last session in the full version of Felucca; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. The installer starts with its erase option selected for this firmware change. Clear it before installing to avoid this extra erase.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fimba",
    "name": "FiMba-1 beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE briefly (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "maku",
    "name": "MAKU",
    "flags": "CSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a valid older FM6 bank is still stored and no valid set of FM6 patches for your sounds is stored",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC for about two seconds to clear every like (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you tap REC to like the current world (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "the FM6 patches used by the thirty-two user sounds",
     "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself, under a condition: your old FM6 bank (B1–B27). At risk when you act: the last session in the full version of Felucca. Carried over: the FM6 patches used by the thirty-two user sounds; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fart",
    "name": "Fart Machine One",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate."
    ],
    "owner_text": "At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation. Fart Machine One does not import or save a music setup or loop. SAVE does nothing. Its recorded loop, tempo and effect choices last only while it stays on. Calibration is separate.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "chord",
    "name": "fm1-chord",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you change favourites or their filter (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "changed to the new format: Once fm1-chord saves its settings, Rainbow Mode cannot read the newer saved copy when you return. Shared preferences and panel calibration may use defaults"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ],
      "first_way_effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase a user sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you erase an FM6 bank patch from the web editor (the computer asks first for that slot only; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you perform factory reset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you send an FM6 bank patch from the web editor (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send or erase an FM6 bank patch directly with a MIDI tool (without asking; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       },
       {
        "way": "when you store the current sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
       }
      ],
      "first_way_effect": "changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered"
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice positions set by hand (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or clear a user sample (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "fm1-chord reads and plays your old FM6 bank (B1–B27) before you write over it.",
     "fm1-chord reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
     "fm1-chord reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored."
    ],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (changed to the new format: Saving, erasing or renaming anything in this sound bank saves all its sounds, including any changed to the new format. They can sound different when you return to your older firmware. Some sound engine numbers and controls mean different things, so a listed sound may play differently. The separate FM6 patches for those sounds are not recovered; other writes can also erase it); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. fm1-chord reads and plays your old FM6 bank (B1–B27) before you write over it. fm1-chord reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored. fm1-chord reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Saved loop choices use ordinary looping. The ends of loops held by a gate signal can sound different. Only matching saved SLICE markers are restored.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save SYN drum kits from the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a song order from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when the working loop has unsaved changes, no song is playing, and you start an update, enter UPDATE MODE or restart with the computer tool [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically, only when you have restored a working loop from a backup [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound on the FM-1 (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a section on the SAVE PROJECT page (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section with SAVE and a section key (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save selected DX7 voices from the editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send an FM6 bank patch from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample kit to USR3 and USR4 (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample set from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP DX7 Banks reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP DX7 Banks keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP DX7 Banks keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. SLOOP DX7 Banks reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP DX7 Banks keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP DX7 Banks keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fumi",
    "name": "FuMi-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: user sounds U01–U16, names and sixteen-step patterns without automation.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jangada",
    "name": "Jangada",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user preset (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       },
       {
        "way": "when you store a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Saving, renaming or erasing any sound in this group writes all sixteen sounds in Jangada’s format. Rainbow Mode cannot read that group when you return. Sounds Jangada could not import are lost. Only older version 1 sounds can be imported. Newer versions look empty and are lost when this group is saved again"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically during use (if the second core fails and playback stops, with AUTO selected by default)",
        "effect": "lost"
       },
       {
        "way": "when you enter power-on hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you learn or clear MIDI CC mappings (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you set screen colours from the USB console (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 1 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 2 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 3 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm SAVE for project 4 (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a project in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm a DX7 bank being sent to the FM-1 (asks first which bank to replace)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a DX7 bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase FM6 sounds in Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase user samples or restore an empty sample slot in Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to Jangada with a computer tool, without the web editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send user samples to the FM-1 from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Jangada reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data.",
     "Jangada reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data.",
     "Jangada reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. Jangada reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Jangada reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Jangada reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use, from its second start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at its first start, after five seconds with playback stopped, no sound and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you calibrate the buttons and knob at power-on; cancelling also requests a settings save (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you change a favourite mark or the filter for favourites (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a starred user sound, which also removes its favourite mark (asks first)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you run MENU calibration, then close MENU (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send MENU settings, display preferences or favourite changes from the editor (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: Later saves to the bank of FM6 patches for your sounds can erase the remaining old FM6 bank. When you return, firmware that needs the older bank cannot use FM6 patches saved in the new format. If a valid current bank of FM6 patches for your sounds remains, the older bank is not changed to the new format"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if the song order or selection has unsaved changes and project slot D is empty, holds WaveLoop’s automatically saved session or holds data WaveLoop cannot read",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only if this song is chosen for automatic saving after loading, saving or restoring a session, and project slot D is empty, holds a session saved automatically for the next start or holds data WaveLoop cannot read; playback must be stopped, with five seconds of silence and no music changes",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or rename this song from the panel while playback has stopped (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save this song or rename it from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that patch)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only if a compatible older FM6 bank remains and there is no current bank of FM6 patches for your sounds [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you erase a user sound (asks for that slot only: press again to confirm; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you erase a user sound from the editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you rename a user sound (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a user sound (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save an FM6 or DRUM user sound (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you send a user sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send an FM6 user sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current FM6 or DRUM sound from the editor (does not ask if that slot is empty; writes the whole bank) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you store the current sound from the editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you edit sample slice markers (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "WaveLoop FM-1 reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable.",
     "WaveLoop FM-1 reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data.",
     "WaveLoop FM-1 reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data.",
     "WaveLoop FM-1 reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
     "WaveLoop FM-1 reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question."
    ],
    "owner_text": "At risk by itself: Project A: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; your old FM6 bank (B1–B27); User sample USR3 and any slice positions you set in SLICE; the FM6 patches used by the thirty-two user sounds; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE. WaveLoop FM-1 reads the FM6 patches used by the thirty-two user sounds until you write over the saved data. Changing a sound or its format can make its separate patch unavailable. WaveLoop FM-1 reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. WaveLoop FM-1 reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. WaveLoop FM-1 reads user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question. WaveLoop FM-1 reads user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Only sounds this firmware can read will play. Saving into a slot it cannot read can replace it without an overwrite question.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "orbit",
    "name": "ORBIT",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you erase a used USER sound from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you send, erase, rename or restore user sounds with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store DX7 cartridge voices with optional USER sound links from the web editor (the computer asks first for that slot only; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       },
       {
        "way": "when you store a user sound from the web editor (does not ask if that slot is empty; writes the whole bank)",
        "effect": "changed to the new format: the next save, erase or rename in this sound bank saves the whole bank in the new format; newer-format sounds shown as empty are lost, and the previous firmware cannot read the bank. Only older version-1 sounds can change to this format; engine numbers and sound controls may mean different things and change how they play"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "lost"
       },
       {
        "way": "automatically, only when song order has an unsaved change as an update or restart starts",
        "effect": "lost"
       },
       {
        "way": "when you hold both OCT buttons as you turn it on to calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored during playback or before a restart is still waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you choose SAVE > PROJECT > SAVE and repeat the action before the time runs out (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE and press white key 5–8 to save section A–D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save, restore or clear a section with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send, erase or restore FM6 patches with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store an FM6 patch from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store selected DX7 cartridge voices from the web editor (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the web editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or restore a sample with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample, CHOP selection or drum kit from the web editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "ORBIT reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name. At risk when you act: the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. ORBIT reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls from HOME and close the menu (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you start calibrating the controls at power-on (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "partly lost (only that slot)",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "automatically during use [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you press REC on the SONG screen to save a section and the song order (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save a section (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as a section (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "SLOOP Floyd FM reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops.",
     "SLOOP Floyd FM keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "SLOOP Floyd FM keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. SLOOP Floyd FM reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Audio loads only if it fits this slot. Sending to or erasing this slot replaces it. Extra slice markers are ignored. Held loops play as ordinary loops. SLOOP Floyd FM keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. SLOOP Floyd FM keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "winampfm",
    "name": "winampFM Synth",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if it can resume music saved in a SLOOP format from before version 2.6 with a different usable drum MIDI channel, and your saved settings include SYN drum kits but no MIDI controls or channels",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore preferences or store SYN drum kits directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the song order (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section A directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section A (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section B directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section B (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section C directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section C (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a section you stored is still waiting to be saved after a restart",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode, start a firmware update or restart from the computer",
        "effect": "lost"
       },
       {
        "way": "when you record the current music into the selected song section (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore section D directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the selected project slot with the PROJECT GO knob (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you store section D (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you store, erase or restore FM6 patches directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR1 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR1 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR2 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR2 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold REC in IMPORTER to erase USR3 (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase USR3 with a MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "winampFM Synth reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "winampFM Synth keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
     "winampFM Synth keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk by itself, under a condition: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name. At risk when you act: the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. winampFM Synth reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. winampFM Synth keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play. winampFM Synth keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "ACS?",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "damaged (part written over)"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving",
        "effect": "lost"
       },
       {
        "way": "when you copy to another pattern (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save song and scenes (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy to another pattern (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a pattern or Save As (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save song and scenes (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when you select a different pattern while playback is stopped and the current pattern or one waiting to be saved needs saving [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you copy to another pattern (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save a pattern or Save As (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you save song and scenes (without asking) [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when a new recording finishes and playback is stopped",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send a sound or DX7 bank from the control page or with the computer tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a take from the control page or with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "at an unknown time (the chip maker's code that does this is not public)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. At risk by itself, under a condition: User sample USR3 and any slice positions you set in SLICE. At risk when you act: the last session in the full version of Felucca.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "salt",
    "name": "Felucca [Salt]",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you erase a user sound (asks first or waits for you to turn again)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       },
       {
        "way": "when you send display or favourite changes from the editor (without asking)",
        "effect": "changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a project (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample slot from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send samples to the FM-1 from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you upload or erase a sample with the computer tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [
     "user sounds U01–U16, names and sixteen-step patterns without automation (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty)",
     "user sounds U17–U32, names and sixteen-step patterns without automation (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty)"
    ],
    "notes": [
     "Felucca [Salt] reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
     "Felucca [Salt] reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
     "Felucca [Salt] reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions."
    ],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes (changed to the new format: Rainbow stores its WRITE song, greeting, hat and volume with settings and favourites. Loading or later saving those settings can change the song and choices; changing firmware and then returning to Rainbow does not preserve all of them. These firmwares save settings and favourites in the same space. An edit here can change the other firmware’s choices). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. Kept but not shown: user sounds U01–U16, names and sixteen-step patterns without automation (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty); user sounds U17–U32, names and sixteen-step patterns without automation (These sounds stay stored but cannot be shown or played. Saving replaces only the slot you save into. Back them up before using a slot that looks empty). Felucca [Salt] reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Felucca [Salt] reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions. Felucca [Salt] reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Slice positions you set in SLICE stay hidden. This firmware has no storage for slice positions.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "pigeon",
    "name": "PIGEON",
    "flags": "ACSK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "changed automatically: PIGEON's next settings save can change Rainbow's WRITE song; learning MIDI controls on PIGEON writes over it. Calibration and shared preferences can still be read, but the WRITE song is not kept"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically, only when you edit the sampler and its matching sample leaves room to save those edits",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you erase a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR1 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR1 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "the last session in the full version of Felucca",
      "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup",
      "ways": [
       {
        "way": "automatically, only at its first start unless RESTORE LAST is off",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save a project directly with a MIDI tool (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       },
       {
        "way": "when you save or paste the selected pattern (without asking)",
        "effect": "changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup"
       }
      ]
     },
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR2 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR2 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase the PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a PIGEON bank with the bank tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample in USR3 in the older format directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a PIGEON bank with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample in USR3 in the older format from the editor (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "PIGEON keeps stored but does not show your old FM6 bank (B1–B27) until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON keeps stored but does not show the FM6 patches used by the thirty-two user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches.",
     "PIGEON reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio.",
     "PIGEON keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
     "PIGEON keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them."
    ],
    "owner_text": "At risk by itself: Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes. At risk by itself, under a condition: User sample USR1 and any slice positions you set in SLICE; the last session in the full version of Felucca (changed to the new format: the next save of this project uses PIGEON's newer project format and sampler setup; your previous firmware cannot load it if you switch back. Engines and sound controls mean different things. In PIGEON, sampler tracks replace the synth performance setup). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. PIGEON keeps stored but does not show your old FM6 bank (B1–B27) until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON keeps stored but does not show the FM6 patches used by the thirty-two user sounds until you write over the saved data. Kept but not shown, for backups. PIGEON does not play these synth patches. PIGEON reads user sample USR1 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample USR2 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON reads user sample USR3 and any slice positions you set in SLICE until you write over the saved data. Sample audio can be read. Loops and slices may play differently; we have not tested whether they sound the same. Only existing slice marks set by hand are read. This does not import a synth project or add missing sample audio. PIGEON keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them. PIGEON keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. These synth sounds are kept but not shown, for backups. PIGEON does not play them.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1move",
    "name": "FM1 Move",
    "flags": "SK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the last session in the full version of Felucca",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear an FM6 bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store or erase an FM6 sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store selected DX7 voices from the device page (the computer asks first about the slots it fills; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "when you finish calibration or let it time out after holding both OCT buttons as you turn it on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send settings or MIDI control assignments with a computer tool or store SYN kits from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample from the device page (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample directly with a MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you upload a sample from the device page (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (without asking; writes the whole bank)",
        "effect": "some or all lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store, rename or erase a user sound directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you store a user sound from the device page (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "FM1 Move reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules.",
     "FM1 Move keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
     "FM1 Move keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play."
    ],
    "owner_text": "At risk when you act: the last session in the full version of Felucca; Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation. FM1 Move reads user samples USR1, USR2 and USR3 until you write over them. Slice marks set by hand are not loaded. Loop modes follow this firmware's playback rules. FM1 Move keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play. FM1 Move keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Newer sounds are kept but not shown. Only older version-1 sounds still in the bank can play.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1quest",
    "name": "FM1 Quest",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the FM6 patches used by the thirty-two user sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode or receive a firmware update",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "your old FM6 bank (B1–B27)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode or receive a firmware update",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you enter update mode with settings waiting to be saved",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE on the SONG screen (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save section A from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section B from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section C from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save section D from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send settings with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you enter update mode or receive a firmware update [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "user sounds U17–U32, names and sixteen-step patterns without automation",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you enter update mode or receive a firmware update [uses its FM6 patches]",
        "effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a user-sound bank with computer commands (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a USER sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       },
       {
        "way": "when you save the current sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "partly lost (the slot you save into)"
       },
       {
        "way": "when you send, save or erase a user sound with computer commands (without asking; writes the whole bank)",
        "effect": "partly lost (only that slot)"
       }
      ],
      "first_way_effect": "only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain"
     },
     {
      "object": "Project A: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project A (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section A from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section A (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project B: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project B (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section B from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section B (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project C: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project C (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section C from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section C (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Project D: four tracks and their sounds, notes, automation, song chain and name",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save a project from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you save project D (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you save section D from SONG (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you save the current music as section D (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or clear a section with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR1 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR1 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR2 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR2 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "User sample USR3 and any slice positions you set in SLICE",
      "effect": "lost",
      "ways": [
       {
        "way": "when you erase a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase sample USR3 by holding REC on it in IMPORTER (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample from the editor (the computer asks first)",
        "effect": "lost"
       },
       {
        "way": "when you send a sample with computer commands (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send or erase training song H1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song H6 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P1 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P2 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P3 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P4 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P5 (without asking)",
        "effect": "damaged (part written over)"
       },
       {
        "way": "when you send or erase training song P6 (without asking)",
        "effect": "damaged (part written over)"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first.",
     "FM1 Quest keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
     "FM1 Quest keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound."
    ],
    "owner_text": "At risk by itself: the FM6 patches used by the thirty-two user sounds; your old FM6 bank (B1–B27); Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; user sounds U01–U16, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it); user sounds U17–U32, names and sixteen-step patterns without automation (only FM6 sounds can lose their own patches and fall back to a factory patch or the initial voice; other sounds remain; other writes can also erase it). At risk when you act: Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE. Quest can play your saved USR1 until you write over it, if its audio and zones fit Quest’s smaller sample slot. Sending a sample to USR1 or erasing it loses the old sample. This includes holding REC on USR1 in IMPORTER when Quest can read it. Sending a sample to USR2 or erasing USR2 can damage the end of the old USR1. Back up USR1 first. FM1 Quest keeps stored but does not show user sounds U01–U16, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound. FM1 Quest keeps stored but does not show user sounds U17–U32, names and sixteen-step patterns without automation until you write over the saved data. Your sounds stay saved but cannot be shown or played. Saving into their slots removes them; saving elsewhere keeps them. Saving on the FM-1 needs another turn of the same control, with no warning that the slot holds a hidden sound.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes",
     "Project A: four tracks and their sounds, notes, automation, song chain and name",
     "Project B: four tracks and their sounds, notes, automation, song chain and name",
     "Project C: four tracks and their sounds, notes, automation, song chain and name",
     "Project D: four tracks and their sounds, notes, automation, song chain and name",
     "user sounds U01–U16, names and sixteen-step patterns without automation",
     "user sounds U17–U32, names and sixteen-step patterns without automation",
     "the FM6 patches used by the thirty-two user sounds",
     "the last session in the full version of Felucca",
     "User sample USR1 and any slice positions you set in SLICE",
     "User sample USR2 and any slice positions you set in SLICE",
     "User sample USR3 and any slice positions you set in SLICE",
     "your old FM6 bank (B1–B27)"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): Felucca preferences, calibration and favourites; Rainbow WRITE song, greeting name, hat, volume limit and look-alikes; Project A: four tracks and their sounds, notes, automation, song chain and name; Project B: four tracks and their sounds, notes, automation, song chain and name; Project C: four tracks and their sounds, notes, automation, song chain and name; Project D: four tracks and their sounds, notes, automation, song chain and name; user sounds U01–U16, names and sixteen-step patterns without automation; user sounds U17–U32, names and sixteen-step patterns without automation; the FM6 patches used by the thirty-two user sounds; the last session in the full version of Felucca; User sample USR1 and any slice positions you set in SLICE; User sample USR2 and any slice positions you set in SLICE; User sample USR3 and any slice positions you set in SLICE; your old FM6 bank (B1–B27). The official route first puts V15 back, then installs Groove OS. Treat this firmware’s saved work as lost and back it up with its own tools before starting. Groove OS’s project saves, autosave, preferences, sample uploads and extra installed pages can also replace leftover work; nobody has published which parts of storage they use. A sound missing from PRESETS may still occupy storage, and do not count on Groove OS’s own backups to keep it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "KNOB 4 WIGGLE on the FM-1",
   "docs_say": "The guide assigns WIGGLE and vibrato to an ordinary KNOB 4 turn.",
   "source_says": "The FM-1 branch consumes KNOB 4 once before checking the HOME hold and reads it again for WIGGLE, so an ordinary accumulated turn is discarded; the HOME-held HAT control works.",
   "docs_ref": {
    "kind": "doc",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "RAINBOW.md",
    "lines": "21",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L21"
   },
   "source_ref": {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1902-1912",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1902-L1912"
   },
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1902-1912",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1902-L1912"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/panel.c",
     "lines": "85-91",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/panel.c#L85-L91"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/hal/fm1_input.h",
     "lines": "587-595",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/hal/fm1_input.h#L587-L595"
    }
   ]
  },
  {
   "topic": "WRITE accompaniment count and stored beats",
   "docs_say": "The WRITE section describes thirteen drum accompaniments.",
   "source_says": "The button cycles 20 beats, but its saved field holds only four bits: FUNK reloads as no beat, and SKA, TRAP, SALSA and SHUFFLE reload as DANCE, MARCH, SPOOKY and ROCK respectively.",
   "docs_ref": {
    "kind": "doc",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "RAINBOW.md",
    "lines": "103",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L103"
   },
   "source_ref": {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1695-1704",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1695-L1704"
   },
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1695-1704",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1695-L1704"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1051-1066",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1066"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1068-1086",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1068-L1086"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "70-71",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L70-L71"
    }
   ]
  },
  {
   "topic": "WRITE tempo persistence",
   "docs_say": "The guide says the song is kept and saved after song changes.",
   "source_says": "SELECT changes the live tempo without marking WRITE dirty, so a tempo-only change is not kept unless another marked song edit is subsequently saved.",
   "docs_ref": {
    "kind": "doc",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "RAINBOW.md",
    "lines": "108-111",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L108-L111"
   },
   "source_ref": {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1872-1876",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1872-L1876"
   },
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1872-1876",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1872-L1876"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1131-1145",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1131-L1145"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1051-1066",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1051-L1066"
    }
   ]
  },
  {
   "topic": "NAME access from WRITE",
   "docs_say": "The guide describes HOME-held ALGORITHM as always opening NAME.",
   "source_says": "The handler requires WRITE to be closed before ALGORITHM can open NAME.",
   "docs_ref": {
    "kind": "doc",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "RAINBOW.md",
    "lines": "36",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L36"
   },
   "source_ref": {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "1864-1871",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1871"
   },
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1864-1871",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1864-L1871"
    }
   ]
  },
  {
   "topic": "Octave behavior in games and drum friends",
   "docs_say": "The guide says GUESS and FOLLOW stay at octave zero and drum assignments do not change with size.",
   "source_says": "KNOB 1 and OCT call kid_size, which directly changes song.octave even for these modes and drum friends; later changes that call kid_knobs restore octave zero.",
   "docs_ref": {
    "kind": "doc",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "RAINBOW.md",
    "lines": "58-66",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L58-L66"
   },
   "source_ref": {
    "kind": "source",
    "repo": "joshbartlettband-web/felucca-rainbow",
    "ref": "1.1.5-rb",
    "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
    "path": "firmware/src/kid.c",
    "lines": "797-806",
    "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L797-L806"
   },
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "797-806",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L797-L806"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1732-1741",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1732-L1741"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1877-1885",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1877-L1885"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "590-591",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L590-L591"
    }
   ]
  }
 ],
 "not_mapped": [
  "No physical FM-1 was used; timing and the ordinary KNOB 4 consume behavior are conclusions from source, not measurements on a unit.",
  "The SMK-37-specific controls are outside this FM-1 panel map."
 ],
 "licence_source": [
  {
   "kind": "doc",
   "repo": "joshbartlettband-web/felucca-rainbow",
   "ref": "1.1.5-rb",
   "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
   "path": "README.md",
   "lines": "13-19",
   "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/README.md#L13-L19"
  },
  {
   "kind": "doc",
   "repo": "joshbartlettband-web/felucca-rainbow",
   "ref": "1.1.5-rb",
   "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
   "path": "LICENSE",
   "lines": "1-6",
   "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/LICENSE#L1-L6"
  }
 ],
 "delta": {
  "parent": "Felucca v1.6.1",
  "parent_map": "control-maps/felucca.json",
  "parent_commit": "a53ecf428c29c780108fd70a31b71a32a6b5c313",
  "fork_point": "Felucca 1.1.5 (276f72a)",
  "entries_carried_unchanged": 388,
  "entries_changed": 213,
  "entries_new": 893,
  "entries_dropped": 94,
  "modes_carried_unchanged": 26,
  "modes_changed": 16,
  "modes_new": 24,
  "modes_dropped": 13,
  "counting_note": "Entry counts include controls and lights; new counts include the toy, while felucca_layer isolates the comparison with the checked parent map; unchanged means owner-facing behavior and words retained, with sources repinned, full-layer scope made explicit and sentence punctuation normalised. Counts include round-1 fixes and appended coverage entries; changed inherited wording or labels are reclassified from unchanged. Round-2 counts include wording/timing fixes and exclude the nonvisual USB fact moved to computer_actions.",
  "felucca_layer": {
   "parent": "Felucca v1.6.1",
   "parent_map": "control-maps/felucca.json",
   "parent_commit": "a53ecf428c29c780108fd70a31b71a32a6b5c313",
   "fork_point": "Felucca 1.1.5 (276f72a)",
   "entries_carried_unchanged": 388,
   "entries_changed": 213,
   "entries_new": 308,
   "entries_dropped": 94,
   "modes_carried_unchanged": 26,
   "modes_changed": 16,
   "modes_new": 7,
   "modes_dropped": 13,
   "counting_note": "Entries include controls and lights; citation repinning and scoping any to the full Felucca layer are not behavioral changes."
  },
  "rainbow_layer_entries_added": 585,
  "rainbow_layer_modes_added": 17,
  "rainbow_layer_global_entries_added_at_assembly": 5,
  "refresh_round_1_reclassified_parent_entries": [
   [
    "controls",
    "button_play_stop",
    2
   ],
   [
    "controls",
    "button_play_stop",
    3
   ],
   [
    "controls",
    "key_f3",
    10
   ],
   [
    "controls",
    "key_fs3",
    5
   ],
   [
    "controls",
    "key_gs3",
    5
   ],
   [
    "controls",
    "key_as3",
    5
   ],
   [
    "controls",
    "key_cs4",
    5
   ],
   [
    "lights",
    "button_play_stop",
    2
   ],
   [
    "lights",
    "key_lights",
    4
   ]
  ],
  "refresh_round_2_reclassified_parent_entries": [
   [
    "controls",
    "button_oct_down",
    15
   ],
   [
    "controls",
    "button_oct_down",
    16
   ],
   [
    "controls",
    "button_oct_down",
    17
   ],
   [
    "controls",
    "button_oct_down",
    18
   ],
   [
    "controls",
    "button_oct_down",
    19
   ],
   [
    "controls",
    "button_oct_down",
    20
   ],
   [
    "controls",
    "encoder_select",
    1
   ]
  ]
 },
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 Unreadable project overwrite",
   "fixed": "Made the overwrite question conditional on a readable occupied slot and named the immediate, non-undoable write.",
   "at": "controls.encoder_knob4[30]; controls.button_oct_up[14]; rainbow.md PROJECT"
  },
  {
   "round": 1,
   "error": "2 Archive loses unreadable projects",
   "fixed": "Restricted backup claims to readable projects and warned that both editor and automatic return-to-stock archives restore unreadable slots as empty.",
   "at": "switching_note.back_up_first/source; storage.backup_note/install_and_startup_writes; rainbow.md backup"
  },
  {
   "round": 1,
   "error": "4 SONG keeps current sounds",
   "fixed": "Replaced whole-project playback with patterns, timing and compatible automation using current sounds.",
   "at": "controls.screen[42]; modes[40]; controls.button_play_stop[8]; rainbow.md SONG"
  },
  {
   "round": 1,
   "error": "5 WRITE entry changes song",
   "fixed": "Documented friend re-stamping, delayed persistence and first-visit-only tempo loading in controls, modes and storage.",
   "at": "controls.button_save[0]; modes[9-10]; storage.objects rainbow.settings; rainbow.md WRITE"
  },
  {
   "round": 1,
   "error": "6 Locked GLO intercepts PLAY",
   "fixed": "Included double-tap-locked GLO, its inability to stop through PLAY, and the external-clock refusal.",
   "at": "controls.button_play_stop[9]; rainbow.md GLO layer"
  },
  {
   "round": 1,
   "error": "7 Drum grid EDIT clear",
   "fixed": "Added cursor-step clearing across all lanes and locks, immediate timing, lack of confirmation/undo and song-chain guard.",
   "at": "controls.button_edit[7]; rainbow.md STEP drum grid"
  },
  {
   "round": 1,
   "error": "8 Conditional confirmation dialog",
   "fixed": "Qualified project overwrite confirmation and included EDIT cursor-step clearing among actions with no question.",
   "at": "modes[51]; controls.screen[53]; rainbow.md Confirm dialog"
  },
  {
   "round": 1,
   "error": "9 Cross-version settings and switching risks",
   "fixed": "Named the Felucca 1.6.1 preferences changed by toy saves and added source-backed first-start, settings/calibration, save/autosave and editor-send risks by firmware, with pre-start backup advice.",
   "at": "switching_note.other_work_at_risk/source/switching_table_status; storage.owner_switching_warnings; rainbow.md Before you switch firmware"
  },
  {
   "round": 1,
   "error": "3 SONG always starts at section 1",
   "fixed": "Replaced selected-section starts with section 1 in both transport controls.",
   "at": "controls.button_play_stop[8]; controls.button_oct_up[16]; rainbow.md SONG"
  },
  {
   "round": 1,
   "error": "10 Toy idle light levels",
   "fixed": "Changed all fifteen false off states to dim, separated the stopped PLAY lamps, and added ARP-off and key idle states; MENU LEDS does not set the toy’s glow.",
   "at": "lights.button_fx[1]; lights.button_sel[1]; lights.button_env[1]; lights.button_lfo[1]; lights.button_edit[1]; lights.button_glo[1]; lights.button_arp[1]; lights.button_arp[2]; lights.button_save[1]; lights.button_play_stop[1]; lights.button_seq[0]; lights.button_rec[0]; lights.button_home[0]; lights.button_oct_down[0]; lights.button_oct_up[0]; appended lights.button_arp/button_play_stop/key_lights; rainbow.md toy lights"
  },
  {
   "round": 1,
   "error": "11 FX key-light meaning",
   "fixed": "Restricted lit FX-layer keys to held or latched effects and performance mutes.",
   "at": "lights.key_lights[10]; rainbow.md FX layer"
  },
  {
   "round": 1,
   "error": "12 Calibration key cancellation",
   "fixed": "Added any-key cancellation to mode/screen, appended each key’s cancel action, and included cancelled power-on calibration in settings-write timing.",
   "at": "modes[64]; controls.screen[74]; appended controls.key_*; storage.settings written_when; rainbow.md calibration"
  },
  {
   "round": 1,
   "error": "13 MENU close always requests save",
   "fixed": "Separated the unconditional save request from the equality check that can skip the stopped flash write.",
   "at": "controls.button_home[9]; rainbow.md MENU"
  },
  {
   "round": 1,
   "error": "14 Copied NAME transport wording",
   "fixed": "Rephrased NAME’s stop-only PLAY action from the firmware handler.",
   "at": "controls.button_play_stop[10]; rainbow.md NAME"
  },
  {
   "round": 1,
   "error": "15 Count-in lamp colour",
   "fixed": "Identified the flashing green lamp and dark orange lamp.",
   "at": "lights.button_play_stop[4]; rainbow.md full Felucca lights"
  },
  {
   "round": 1,
   "error": "16 Private installer is newer",
   "fixed": "Distinguished this run’s name-enabled private artifact from the newer package served by the private installer, with the check’s measured provenance.",
   "at": "version_note.public_and_private/private_installer_provenance; rainbow.md intro"
  },
  {
   "round": 1,
   "error": "17 Registry documentation pin",
   "fixed": "Pinned RAINBOW.md and README.md to the full mapped commit.",
   "at": "refresh/work/rainbow.registry.json sources"
  },
  {
   "round": 1,
   "error": "18 Owner prose cleanup",
   "fixed": "Removed the evidence-grade line, duplicate switching-table notice and internal brief wording.",
   "at": "version_note.stars; rainbow.md intro/switching/stars"
  },
  {
   "round": 1,
   "error": "19 Disagreement scope and document lines",
   "fixed": "Moved GUESS to a sourced clarification with the correct guide row and corrected NAME’s guide row; control behavior remains unchanged.",
   "at": "original disagreements[1] and [4]; source_clarifications; rainbow.md disagreements"
  },
  {
   "round": 1,
   "error": "20 Citation corrections",
   "fixed": "Repinned JOIN selection/action and BELL naming evidence, added the SEQ hold handler and removed duplicate kid initializer citations.",
   "at": "controls.encoder_knob4[21]; controls.key_as4[21]; modes[40].source; modes[65].source"
  },
  {
   "round": 1,
   "error": "21 Distinct labels for different jobs",
   "fixed": "Separated pattern/track clears, performance/track mutes, and GLO status/MENU system labels.",
   "at": "controls.key_f3[23-24]; controls.key_fs3/gs3/as3/cs4[19-20]; controls.screen[64,71]"
  },
  {
   "round": 1,
   "error": "22 Packed WRITE boundary",
   "fixed": "Corrected all layout and foreign-read descriptions to450 packed bits, ending at favourite[15][24] bit1; the next byte is untouched by packing.",
   "at": "storage.objects[0].rainbow_layout; storage.reads_foreign what_happens/reader_auto_changes"
  },
  {
   "round": 1,
   "error": "Coverage Audio, NAME and computer operations",
   "fixed": "Added the sub-octave bass, fixed warm highs, NAME exit-timer scope, live USB writes and standalone installer name send.",
   "at": "appended controls.key_* / button_save / screen; controls.knob_master[0]; computer_actions; rainbow.md additions"
  },
  {
   "round": 1,
   "error": "1–22 Delta and guide consistency",
   "fixed": "Regenerated mode tables from corrected entries without moving JSON entries, updated inherited delta counts and restricted live-USB screen coverage to Rainbow play/WRITE.",
   "at": "delta; rainbow.md mode tables; appended controls.screen USB ACTIVE"
  },
  {
   "round": 1,
   "error": "1 Related USER overwrite qualification",
   "fixed": "Applied the same readable-slot confirmation condition to the USER save selector after re-reading its separate handler.",
   "at": "controls.encoder_knob4[27]; rainbow.md USER"
  },
  {
   "round": 2,
   "error": "1 Melodee banks are rejected",
   "fixed": "Removed Melodee from imported banks and explicitly described empty-looking slots and the first whole-bank replacement without an overwrite question.",
   "at": "switching_note.other_work_at_risk[5]/source; storage.owner_switching_warnings[5]; rainbow.md Before you switch firmware"
  },
  {
   "round": 2,
   "error": "2 Conditional USER overwrite question",
   "fixed": "Qualified USER’s OCT+ confirmation using the same readable-slot check as its save selector.",
   "at": "controls.button_oct_up[12]; rainbow.md USER"
  },
  {
   "round": 2,
   "error": "3 Compatible FM6 patch entries survive",
   "fixed": "Distinguished destructive overlaps from compatible patch banks; added GHOULBOX and explained target-slot updates and matching-record playback.",
   "at": "switching_note.other_work_at_risk[7]/source; storage.owner_switching_warnings[7]; rainbow.md Before you switch firmware"
  },
  {
   "round": 2,
   "error": "4 USB service is not an indicator",
   "fixed": "Removed the final nonvisual screen entry and moved its fact and sources to computer_actions.",
   "at": "removed controls.screen[75]; appended computer_actions[1]; rainbow.md computer connection"
  },
  {
   "round": 2,
   "error": "5 WRITE tempo reload resets each boot",
   "fixed": "Made the first-visit condition explicitly mean the first visit after each power-on in both WRITE modes and the guide.",
   "at": "modes[9-10]; rainbow.md mode table/WRITE sections"
  },
  {
   "round": 2,
   "error": "6 No alternate SELECT modes",
   "fixed": "Removed the later-version SELECT-mode claim and cited this build’s tempo handler.",
   "at": "controls.encoder_select[5]; rainbow.md GLO layer"
  },
  {
   "round": 2,
   "error": "7 FX ALL OFF acts on release",
   "fixed": "Changed the gesture in place from press to release and described its effect and macro reset.",
   "at": "controls.button_oct_down[26]; rainbow.md FX layer"
  },
  {
   "round": 2,
   "error": "8 Layer-specific restoration",
   "fixed": "Replaced the shared restore list with each layer’s saved state, included SEQ/REC song-chain guards and source-proven automation-capacity failures, and kept release timing.",
   "at": "controls.button_oct_down[21-25]; rainbow.md GLO/SEL/EDIT/SEQ TOOLS/REC layers"
  }
 ],
 "source_clarifications": [
  {
   "topic": "GUESS response and keyboard sound",
   "detail": "TRY AGAIN adds no separate error tone; the normal keyboard still sounds the pressed key, so the guide’s feedback wording is not treated as a proven contradiction.",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/kid.c",
     "lines": "1518-1539",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/kid.c#L1518-L1539"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/seq.c",
     "lines": "729-784",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/seq.c#L729-L784"
    },
    {
     "kind": "doc",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "RAINBOW.md",
     "lines": "49",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/RAINBOW.md#L49"
    }
   ]
  }
 ],
 "computer_actions": [
  {
   "name": "Send greeting name from installer",
   "action": "The installer’s separate Send name button sends the name without reinstalling; it requests a whole-settings save without an on-unit question, writing now if stopped or waiting until playback stops.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "web/index_pkg.html",
     "lines": "288-316",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/web/index_pkg.html#L288-L316"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/editor.c",
     "lines": "449-475",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor.c#L449-L475"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/editor_preferences.c",
     "lines": "43-52",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_preferences.c#L43-L52"
    }
   ]
  },
  {
   "name": "USB commands during Rainbow play",
   "action": "While Rainbow play or WRITE is shown, USB editor and update requests remain active, so computer sends can write stored data without a question on the unit.",
   "evidence": "read-in-source",
   "source": [
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/main.c",
     "lines": "333-345",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/main.c#L333-L345"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/editor.c",
     "lines": "449-475",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor.c#L449-L475"
    },
    {
     "kind": "source",
     "repo": "joshbartlettband-web/felucca-rainbow",
     "ref": "1.1.5-rb",
     "commit": "2539ec99f8ec6137658f13a31492c232aba3e11a",
     "path": "firmware/src/editor_preferences.c",
     "lines": "43-52",
     "url": "https://github.com/joshbartlettband-web/felucca-rainbow/blob/2539ec99f8ec6137658f13a31492c232aba3e11a/firmware/src/editor_preferences.c#L43-L52"
    }
   ]
  }
 ],
 "checker_disputes_refresh": []
}