{
 "firmware": "FuMi-1",
 "slug": "fumi",
 "author": "cartesive (FuMi-1), with the FoMni platform by Charles Vestal and Felucca platform by Leo Kuroshita",
 "repo": "https://github.com/cartesive/fumi-1",
 "licence": "GPL-3.0-only; msfa synthesis core Apache-2.0; bundled fonts SIL OFL-1.1",
 "closed_source": false,
 "mapped_release": "fumi-1.0.7",
 "mapped_commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
 "release_date": "2026-10-11",
 "date_mapped": "2026-10-17",
 "status": "Independently checked: zero errors in round 3 (2026-10-17). No device testing.",
 "turns_it_into": "A Suiko ST-50-inspired instrument for accompanying Japanese poetry, with tuned scale keys, fourteen FM instruments, koto ornaments and a temporary performance looper.",
 "docs": [
  {
   "title": "FuMi-1 guide",
   "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/README.md",
   "words": 3296,
   "word_count_method": "Whitespace-separated tokens in the Markdown source.",
   "read_at": "2026-10-17"
  },
  {
   "title": "Licensing",
   "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/LICENSING.md",
   "read_at": "2026-10-17"
  }
 ],
 "install": {
  "official": "https://github.com/cartesive/fumi-1/releases/tag/fumi-1.0.7",
  "hub": "https://thefirmwarehub.com/",
  "official_installer": "https://cartesive.github.io/fumi-1/install/"
 },
 "part_id_notes": "Key ids name physical positions F3–G5, not the pitches FuMi-1 plays; white and black positions are translated by ui.c:30-35. SEL is the printed button. Except OCT−/OCT+, short button actions occur on release; holds consume the tap. Page modes, black-key modes and loop states are independent layers that can coexist. lights.button_play_stop uses light=green or red. Key lights are grouped under lights.key_lights and groups.key_lights. The any mode means ordinary operation, excluding calibration, crash, updater and safe mode. Encoder holds do not add modifier functions. This map was read in source, never tested on a unit.",
 "modes": [
  {
   "id": "home",
   "name": "Home page",
   "how_to_get_there": "Release HOME.",
   "what_it_is": "Ring time, trill rate, vibrato depth and reverb.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "sound",
   "name": "Sound page",
   "how_to_get_there": "Release FX.",
   "what_it_is": "Low cut, high cut, character and reverb size.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "bend",
   "name": "Bend page",
   "how_to_get_there": "Release EDIT.",
   "what_it_is": "Up-bend target, down-bend amount, bend time and slide time.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "tuning",
   "name": "Tuning page",
   "how_to_get_there": "Hold SEL past 400 ms.",
   "what_it_is": "Tuning family, tuning depth, fine tuning and reference A.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "loop",
   "name": "Loop page",
   "how_to_get_there": "Release ENV.",
   "what_it_is": "Loop ruler tempo, ruler length and click.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "trill",
   "name": "Trill page",
   "how_to_get_there": "Hold GLO past 400 ms from any page except Trill.",
   "what_it_is": "Feel, pair gap, second-stroke strength and oroshi acceleration.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "trill2",
   "name": "Trill 2 page",
   "how_to_get_there": "Hold GLO past 400 ms from Trill.",
   "what_it_is": "First-stroke velocity and timing variation.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "16-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L16-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-260",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L260"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "351-358",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L358"
    }
   ]
  },
  {
   "id": "upper_row",
   "name": "Upper-row black keys",
   "how_to_get_there": "Release SEQ until the upper-row message appears.",
   "what_it_is": "The eleven black keys play extra pitches.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "270-278",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L270-L278"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "307-314",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
    }
   ]
  },
  {
   "id": "ornaments",
   "name": "Ornament black keys",
   "how_to_get_there": "Release SEQ until the ornaments message appears.",
   "what_it_is": "Black keys apply momentary playing techniques.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "30-35",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "270-278",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L270-L278"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "307-314",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
    }
   ]
  },
  {
   "id": "loop_idle",
   "name": "Empty loop",
   "how_to_get_there": "Switch on, clear the loop, tap REC or PLAY while armed, or undo the final completed layer.",
   "what_it_is": "No loop is recorded.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "838",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L838"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "869",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L869"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "888-897",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L888-L897"
    }
   ]
  },
  {
   "id": "loop_armed",
   "name": "Armed loop",
   "how_to_get_there": "Release REC with an empty loop.",
   "what_it_is": "The first note key starts recording.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    }
   ]
  },
  {
   "id": "loop_recording",
   "name": "First take",
   "how_to_get_there": "Play a note key while armed.",
   "what_it_is": "Records the first layer until closed or the ruler ends.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    }
   ]
  },
  {
   "id": "loop_playback",
   "name": "Playing loop",
   "how_to_get_there": "Close the first take or release PLAY from stopped.",
   "what_it_is": "The loop repeats under your playing.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    }
   ]
  },
  {
   "id": "loop_overdub",
   "name": "Overdub",
   "how_to_get_there": "Release REC with a playing or stopped loop.",
   "what_it_is": "Adds a layer to the loop.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    }
   ]
  },
  {
   "id": "loop_stopped",
   "name": "Stopped loop",
   "how_to_get_there": "Release PLAY during playback or overdub.",
   "what_it_is": "The loop stays in memory and can restart from the beginning.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "832-870",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L832-L870"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "907-917",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L917"
    }
   ]
  },
  {
   "id": "power_on",
   "name": "Power-on",
   "how_to_get_there": "Switch on.",
   "what_it_is": "Startup loads the saved setup and calibration.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "245-301",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L245-L301"
    }
   ]
  },
  {
   "id": "calibration",
   "name": "Hardware calibration",
   "how_to_get_there": "Hold both OCT buttons while switching on.",
   "what_it_is": "Teaches the button positions and encoder directions; finishing attempts a flash save without a question.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "298-299",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L298-L299"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/panel.c",
     "lines": "47-108",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L47-L108"
    }
   ]
  },
  {
   "id": "safe_mode",
   "name": "Safe mode",
   "how_to_get_there": "Entered after two consecutive failed starts.",
   "what_it_is": "Sound is disabled and USB remains available for reinstalling.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "177-191",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L177-L191"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "370-383",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L370-L383"
    }
   ]
  },
  {
   "id": "update",
   "name": "Chip update mode",
   "how_to_get_there": "Hold both OCT buttons for over five seconds, receive the supported USB updater request, or reach four consecutive failed starts.",
   "what_it_is": "Leaves the instrument for the chip updater, which can also start automatically after repeated startup failures; releasing the OCT buttons before the countdown ends cancels that gesture.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "319-336",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L319-L336"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/usb.c",
     "lines": "601-606",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/usb.c#L601-L606"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "346-347",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L346-L347"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "375-383",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L375-L383"
    }
   ]
  },
  {
   "id": "crash",
   "name": "Crash screen",
   "how_to_get_there": "Appears after a firmware fault.",
   "what_it_is": "Diagnostic screen followed by an automatic restart after about four seconds.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "142-162",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L142-L162"
    }
   ]
  },
  {
   "id": "install_update",
   "name": "Installation progress",
   "how_to_get_there": "Start an installation through the USB installer.",
   "what_it_is": "Tracks the transfer and checks before installing and restarting, or reports a failed attempt.",
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/main_fm1.c",
     "lines": "338-344",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L338-L344"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/main.c",
     "lines": "105-116",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/main.c#L105-L116"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/ota.c",
     "lines": "257-265",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L257-L265"
    }
   ]
  }
 ],
 "controls": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "HOME",
    "action": "Opens the Home page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "257",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L257"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "335-349",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L335-L349"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SOUND",
    "action": "Opens the Sound page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "258",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L258"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "335-349",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L335-L349"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "BEND",
    "action": "Opens the Bend page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "259",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L259"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "335-349",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L335-L349"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "LOOP PAGE",
    "action": "Opens the Loop page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "260",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L260"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "335-349",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L335-L349"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "TUNING TAP",
    "action": "Switches from an alternative tuning to EQUAL and remembers it, or from EQUAL back to that remembered tuning, initially SUIKO, unless the hold opened Tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "192-200",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L192-L200"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "351-354",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L354"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "TUNING PAGE",
    "action": "After more than 400 ms opens Tuning and suppresses the tuning toggle on release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "351-354",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L351-L354"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "MONO / POLY",
    "action": "Toggles single-note and polyphonic playing unless the hold already opened a Trill page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "266-269",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L266-L269"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "355-358",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L355-L358"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "550-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L550-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "TRILL PAGES",
    "action": "After more than 400 ms switches from Trill to Trill 2 or from any other page to Trill, without toggling mono on release.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "355-358",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L355-L358"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "VIBRATO",
    "action": "Toggles vibrato for live playing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "264",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L264"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1257-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1257-L1275"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "TRILL",
    "action": "Toggles repeating strokes on the most recently held live note, with pairs and accents set by the Trill pages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "265",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L265"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "374-388",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L374-L388"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1194-1240",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1194-L1240"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "BLACK MODE",
    "action": "Switches black keys between extra pitches and ornaments, releasing all black-key notes and clearing live ornament holds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "270-278",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L270-L278"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SAVE",
    "action": "Immediately attempts to replace the saved setup and light preference without a question or undo, excluding the loop and temporary external patch, and reports a flash error if it fails.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "280-286",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L280-L286"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/app.h",
      "lines": "18-23",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/app.h#L18-L23"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "loop_idle",
    "gesture": "release",
    "short_label": "ARM",
    "action": "Arms recording so the first note key begins the first take.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "837",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L837"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "loop_armed",
    "gesture": "release",
    "short_label": "CANCEL ARM",
    "action": "Cancels recording readiness without deleting a take.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "838",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L838"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "loop_recording",
    "gesture": "release",
    "short_label": "CLOSE TAKE",
    "action": "Ends the first take and starts looping it, keeping at least one beat and adding releases for held actions.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "839",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L839"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "loop_playback",
    "gesture": "release",
    "short_label": "OVERDUB ON",
    "action": "Starts a new overdub layer while the loop continues.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "840-848",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L840-L848"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "loop_overdub",
    "gesture": "release",
    "short_label": "OVERDUB OFF",
    "action": "Ends the current overdub and continues playback, adding releases for its held actions.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "850",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L850"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "loop_stopped",
    "gesture": "release",
    "short_label": "DUB FROM TOP",
    "action": "Starts the stopped loop from the beginning with overdub enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "203-213",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L203-L213"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "840-848",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L840-L848"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-829",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L829"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "CLEAR LOOP",
    "action": "After more than one second deletes the entire loop from memory with no undo, showing a keep-holding prompt after 400 ms when nonempty and suppressing the release tap.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "227-251",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L227-L251"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "815-821",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L815-L821"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "loop_idle",
    "gesture": "release",
    "short_label": "-",
    "action": "Leaves the empty loop unchanged.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "870",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L870"
     }
    ]
   },
   {
    "mode": "loop_armed",
    "gesture": "release",
    "short_label": "CANCEL WAIT",
    "action": "Cancels the armed first take.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "869",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L869"
     }
    ]
   },
   {
    "mode": "loop_recording",
    "gesture": "release",
    "short_label": "FINISH TAKE",
    "action": "Closes the first take and begins playback instead of stopping it.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "868",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L868"
     }
    ]
   },
   {
    "mode": "loop_playback",
    "gesture": "release",
    "short_label": "STOP",
    "action": "Stops playback and resets its position to the beginning while retaining recorded layers.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "857-864",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L857-L864"
     }
    ]
   },
   {
    "mode": "loop_overdub",
    "gesture": "release",
    "short_label": "STOP DUB",
    "action": "Ends the overdub and stops the loop at the beginning while retaining its recorded layers.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "855-864",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L855-L864"
     }
    ]
   },
   {
    "mode": "loop_stopped",
    "gesture": "release",
    "short_label": "START",
    "action": "Starts the retained loop from the beginning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "215-225",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L215-L225"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "867",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L867"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "long_press",
    "short_label": "UNDO LAYER",
    "action": "After more than one second removes the newest recorded layer without redo, or drops the first take back to armed, with a keep-holding prompt after 400 ms and no release tap.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "227-251",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L227-L251"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "873-902",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L873-L902"
     }
    ]
   },
   {
    "mode": "loop_overdub",
    "gesture": "long_press",
    "short_label": "UNDO EMPTY",
    "action": "After more than one second in an empty new overdub removes the previous recorded layer without redo and ends overdubbing, returning to playback if layers remain or emptying the loop if none remain.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "877-897",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L877-L897"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "227-251",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L227-L251"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "873-899",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L873-L899"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "229-251",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L229-L251"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "press",
    "short_label": "RETRY",
    "action": "Tries starting FuMi-1 again after the safe screen has been up for at least 500 ms.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "205-218",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L205-L218"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "OCT -",
    "action": "With no panel key held shifts all scale keys one octave down, limited to one octave each side of normal.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "147-165",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L147-L165"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "29",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L29"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "48-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L48-L78"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "BEND DOWN",
    "action": "With any panel key held bends the newest live note down by the Bend page setting, unless the other OCT button is already held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "147-157",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L147-L157"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "305-315",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L305-L315"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "208-210",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L208-L210"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SPRING BACK",
    "action": "If this press started a bend, returns toward the original pitch, finishing a short tap’s bend first.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "168-173",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/bend.c",
      "lines": "59-86",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/bend.c#L59-L86"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_up",
    "short_label": "UPDATE 5s",
    "action": "Holding both OCT buttons for five seconds enters the chip updater, with a countdown after two seconds and release to cancel, but the first OCT press can already shift the octave or bend a held note and cancelling keeps any octave change.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-336",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L319-L336"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "145-165",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L145-L165"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_up",
    "short_label": "CALIBRATE",
    "action": "Starts hardware calibration with both OCT buttons held at power-on, attempting to save the completed button and encoder map without a question or undo and keeping the old map after a 30-second idle timeout.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "298-299",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L298-L299"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/panel.c",
      "lines": "47-108",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L47-L108"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "OCT +",
    "action": "With no panel key held shifts all scale keys one octave up, limited to one octave each side of normal.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "147-165",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L147-L165"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "29",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L29"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "48-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L48-L78"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "BEND UP",
    "action": "With any panel key held bends the newest live note up by the Bend page setting, unless the other OCT button is already held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "147-157",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L147-L157"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "305-315",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L305-L315"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "208-210",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L208-L210"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "SPRING BACK",
    "action": "If this press started a bend, returns toward the original pitch, finishing a short tap’s bend first.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "168-173",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L168-L173"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/bend.c",
      "lines": "59-86",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/bend.c#L59-L86"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "press_with:button_oct_down",
    "short_label": "UPDATE 5s",
    "action": "Holding both OCT buttons for five seconds enters the chip updater, with a countdown after two seconds and release to cancel, but the first OCT press can already shift the octave or bend a held note and cancelling keeps any octave change.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-336",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L319-L336"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "145-165",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L145-L165"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "power_on_holding:button_oct_down",
    "short_label": "CALIBRATE",
    "action": "Starts hardware calibration with both OCT buttons held at power-on, attempting to save the completed button and encoder map without a question or undo and keeping the old map after a 30-second idle timeout.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "298-299",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L298-L299"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/panel.c",
      "lines": "47-108",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L47-L108"
     }
    ]
   }
  ],
  "encoder_select": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "HON",
    "action": "Selects 本数 (Hon, the key reference) from S4 through S1 then 1–12 in semitone steps, with 1 placing the sixth white key at A3 before other pitch offsets.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "364-365",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L364-L365"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "28-30",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L28-L30"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "48-72",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L48-L72"
     }
    ]
   }
  ],
  "encoder_presets": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "INSTRUMENT",
    "action": "Chooses among fourteen instruments, from the two kotos through winds, Kokyu, percussion and four additional plucked sounds, without changing instruments already retained by loop layers.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "366-367",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L366-L367"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi_patches.h",
      "lines": "3-10",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi_patches.h#L3-L10"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "684-713",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L684-L713"
     }
    ]
   }
  ],
  "encoder_algorithm": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "SCALE",
    "action": "Chooses IN, YO or MIN’YO, raising the second and fifth white-key scale degrees by zero, one or two semitones while the black upper row keeps its own pitches.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "368-369",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L368-L369"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "6-11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L6-L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L78"
     }
    ]
   }
  ],
  "knob_master": [
   {
    "mode": "any",
    "gesture": "turn",
    "short_label": "VOLUME",
    "action": "Volume.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "310-317",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L310-L317"
     }
    ]
   }
  ],
  "encoder_knob1": [
   {
    "mode": "home",
    "gesture": "turn",
    "short_label": "YOIN",
    "action": "Sets 余韻 (Yoin, release ring time) from 0–100, about 20 ms to eight seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1016-1019",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1016-L1019"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "short_label": "LOW CUT",
    "action": "Raises the low-cut frequency from about 20 to 400 Hz over 0–100.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1027",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1027"
     }
    ]
   },
   {
    "mode": "bend",
    "gesture": "turn",
    "short_label": "UP TARGET",
    "action": "Chooses an upward bend of a semitone, whole tone or next white-key scale step, with upper-row notes using a semitone for Scale.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "275-283",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L275-L283"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "305-310",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L305-L310"
     }
    ]
   },
   {
    "mode": "tuning",
    "gesture": "turn",
    "short_label": "TUNING",
    "action": "Chooses EQUAL for equal temperament, SUIKO for the measured ST-50 offsets, KOTO for its pure-interval table or USER for saved per-note trims.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "15-32",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L15-L32"
     }
    ]
   },
   {
    "mode": "loop",
    "gesture": "turn",
    "short_label": "LOOP BPM",
    "action": "Sets the ruler and click tempo from 30–120 BPM without time-stretching an existing loop.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "40",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L40"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "937-961",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L937-L961"
     }
    ]
   },
   {
    "mode": "trill",
    "gesture": "turn",
    "short_label": "TRILL FEEL",
    "action": "Moves from even repeated strokes at zero to the full paired timing and accents at 100.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "32",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L32"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "353-373",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L353-L373"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1155-1168",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1155-L1168"
     }
    ]
   },
   {
    "mode": "trill2",
    "gesture": "turn",
    "short_label": "FIRST STROKE",
    "action": "Sets the first trill stroke’s velocity from 100–127, blended by Trill feel.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "356-373",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L356-L373"
     }
    ]
   }
  ],
  "encoder_knob2": [
   {
    "mode": "home",
    "gesture": "turn",
    "short_label": "TRILL RATE",
    "action": "Sets the average trill speed from 0–100, with higher values shortening the stroke interval from about 400 to 60 ms.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1024",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1024"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "short_label": "HIGH CUT",
    "action": "Opens the high-cut filter over 0–100, with the fully open setting bypassing its smoothing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1028-1030",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1028-L1030"
     }
    ]
   },
   {
    "mode": "bend",
    "gesture": "turn",
    "short_label": "DOWN CENTS",
    "action": "Sets downward bend depth from zero to 100 cents.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "33",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L33"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "305-310",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L305-L310"
     }
    ]
   },
   {
    "mode": "tuning",
    "gesture": "turn",
    "short_label": "DEPTH",
    "action": "Scales the built-in tuning offsets from 0–150 percent, with no effect on USER trims.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "28",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L28"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "54-59",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L54-L59"
     }
    ]
   },
   {
    "mode": "loop",
    "gesture": "turn",
    "short_label": "LOOP BEATS",
    "action": "Sets the first take’s automatic end from 8–64 beats, with an earlier close still allowed and at least one beat retained.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "40",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L40"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "800-812",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L800-L812"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "937-961",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L937-L961"
     }
    ]
   },
   {
    "mode": "trill",
    "gesture": "turn",
    "short_label": "PAIR GAP",
    "action": "Sets the short interval within each stroke pair from 30–50 percent, displayed as Tight, Paired, Loose or Even.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "90-92",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L90-L92"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1155-1168",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1155-L1168"
     }
    ]
   },
   {
    "mode": "trill2",
    "gesture": "turn",
    "short_label": "JITTER",
    "action": "Sets trill timing variation from 0–20, blended by Trill feel.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1155-1168",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1155-L1168"
     }
    ]
   }
  ],
  "encoder_knob3": [
   {
    "mode": "home",
    "gesture": "turn",
    "short_label": "VIB DEPTH",
    "action": "Sets vibrato depth from 0–100, corresponding to zero to 50 cents.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1023",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1023"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "short_label": "CHARACTER",
    "action": "Adds a warmer balance and soft saturation over 0–100.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1389-1392",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1389-L1392"
     }
    ]
   },
   {
    "mode": "bend",
    "gesture": "turn",
    "short_label": "BEND TIME",
    "action": "Sets the bend rise time from 20–300 ms, with the return taking one third longer.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "34",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L34"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "305-310",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L305-L310"
     }
    ]
   },
   {
    "mode": "tuning",
    "gesture": "turn",
    "short_label": "FINE TUNE",
    "action": "Moves the panel-key tuning by up to 50 cents each way.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "29",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L29"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "63-66",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L63-L66"
     }
    ]
   },
   {
    "mode": "loop",
    "gesture": "turn",
    "short_label": "CLICK",
    "action": "Turns the beat click on clockwise and off counter-clockwise during armed, recording, playing and overdub states.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "968-973",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L968-L973"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "98-107",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L98-L107"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "123-130",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L123-L130"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat.h",
      "lines": "30",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat.h#L30"
     }
    ]
   },
   {
    "mode": "trill",
    "gesture": "turn",
    "short_label": "TA LEVEL",
    "action": "Sets second-stroke velocity from 30–100, displayed as Faint, Light, Softer or Same and blended by Trill feel.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "93-95",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L93-L95"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "353-373",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L353-L373"
     }
    ]
   },
   {
    "mode": "trill2",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on Trill 2.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "123-129",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L123-L129"
     }
    ]
   }
  ],
  "encoder_knob4": [
   {
    "mode": "home",
    "gesture": "turn",
    "short_label": "REVERB",
    "action": "Sets the amount sent to the plate reverb from 0–100.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1032",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1032"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "turn",
    "short_label": "REVERB SIZE",
    "action": "Changes the plate reverb size over 0–100.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1033",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1033"
     }
    ]
   },
   {
    "mode": "bend",
    "gesture": "turn",
    "short_label": "SLIDE TIME",
    "action": "Sets slide smoothing time from 10–500 ms, though this release has no panel control to enable slide and it defaults off.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "34",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L34"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1026",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1026"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "254-289",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L289"
     }
    ]
   },
   {
    "mode": "tuning",
    "gesture": "turn",
    "short_label": "REFERENCE A",
    "action": "Sets reference A from 430–445 Hz for panel keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "29",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L29"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "257-283",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L257-L283"
     }
    ]
   },
   {
    "mode": "loop",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on the Loop page.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "24",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L24"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "123-129",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L123-L129"
     }
    ]
   },
   {
    "mode": "trill",
    "gesture": "turn",
    "short_label": "OROSHI",
    "action": "Selects None, Short, Medium or Long for 颪 (Oroshi, a live ornament trill that accelerates toward the chosen rate), without a ramp on loop replay.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "76-89",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L76-L89"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1201-1237",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1201-L1237"
     }
    ]
   },
   {
    "mode": "trill2",
    "gesture": "turn",
    "short_label": "-",
    "action": "Does nothing on Trill 2.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "19-26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "370-375",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L370-L375"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "27-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L27-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "26",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L26"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "123-129",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L123-L129"
     }
    ]
   }
  ],
  "key_f3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MI 1",
    "action": "Plays white scale key 1, degree mi in row octave 1, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_g3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "FA 1",
    "action": "Plays white scale key 2, degree fa in row octave 1, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_a3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "LA 1",
    "action": "Plays white scale key 3, degree la in row octave 1, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_b3": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "TI 1",
    "action": "Plays white scale key 4, degree ti in row octave 1, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_c4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "DO 1",
    "action": "Plays white scale key 5, degree do in row octave 1, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_d4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MI 2",
    "action": "Plays white scale key 6, degree mi in row octave 2, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_e4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "FA 2",
    "action": "Plays white scale key 7, degree fa in row octave 2, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_f4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "LA 2",
    "action": "Plays white scale key 8, degree la in row octave 2, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_g4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "TI 2",
    "action": "Plays white scale key 9, degree ti in row octave 2, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_a4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "DO 2",
    "action": "Plays white scale key 10, degree do in row octave 2, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_b4": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MI 3",
    "action": "Plays white scale key 11, degree mi in row octave 3, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_c5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "FA 3",
    "action": "Plays white scale key 12, degree fa in row octave 3, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_d5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "LA 3",
    "action": "Plays white scale key 13, degree la in row octave 3, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_e5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "TI 3",
    "action": "Plays white scale key 14, degree ti in row octave 3, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_f5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "DO 3",
    "action": "Plays white scale key 15, degree do in row octave 3, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_g5": [
   {
    "mode": "any",
    "gesture": "press",
    "short_label": "MI 4",
    "action": "Plays white scale key 16, degree mi in row octave 4, using the selected instrument, scale and tuning.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "69-73",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L69-L73"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "542-566",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L542-L566"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "release",
    "short_label": "RELEASE",
    "action": "Releases this note into its Yoin tail, or in mono returns to the most recently held note.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "323-325",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L323-L325"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   }
  ],
  "key_fs3": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 1",
    "action": "Plays black upper-row key 1, degree fa♯ in row octave 1, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "VIB HOLD",
    "action": "Adds vibrato to live notes while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1257-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1257-L1275"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Ends the momentary vibrato request, with the LFO latch able to keep vibrato on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_gs3": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 2",
    "action": "Plays black upper-row key 2, degree sol in row octave 1, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "TRILL HOLD",
    "action": "Repeats the newest held live note in pairs, using the selected Oroshi acceleration when enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1194-1240",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1194-L1240"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Ends the momentary trill request, with the ARP latch able to keep the trill on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_as3": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 3",
    "action": "Plays black upper-row key 3, degree ti♭ in row octave 1, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "DAMP",
    "action": "Rapidly damps all live notes on the press, leaving loop notes alone.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Releases the damp key without restoring notes already damped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_cs4": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 4",
    "action": "Plays black upper-row key 4, degree do♯ in row octave 1, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "STRONG",
    "action": "Uses the configured first-stroke strength for new live notes while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "401-421",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L401-L421"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Returns future plucks to their ordinary accent rules without weakening notes already struck.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_ds4": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 5",
    "action": "Plays black upper-row key 5, degree re in row octave 1, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "OSHIDE",
    "action": "Applies 押し手 (Oshide, a whole-tone rise) to live notes while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1254",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1254"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1257-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1257-L1275"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Lets the whole-tone rise ease back to the original pitch.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_fs4": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 6",
    "action": "Plays black upper-row key 6, degree fa♯ in row octave 2, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "VIB HOLD",
    "action": "Adds vibrato to live notes while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1257-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1257-L1275"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Ends the momentary vibrato request, with the LFO latch able to keep vibrato on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_gs4": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 7",
    "action": "Plays black upper-row key 7, degree sol in row octave 2, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "TRILL HOLD",
    "action": "Repeats the newest held live note in pairs, using the selected Oroshi acceleration when enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1194-1240",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1194-L1240"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Ends the momentary trill request, with the ARP latch able to keep the trill on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_as4": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 8",
    "action": "Plays black upper-row key 8, degree ti♭ in row octave 2, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "DAMP",
    "action": "Rapidly damps all live notes on the press, leaving loop notes alone.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Releases the damp key without restoring notes already damped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_cs5": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 9",
    "action": "Plays black upper-row key 9, degree do♯ in row octave 2, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "STRONG",
    "action": "Uses the configured first-stroke strength for new live notes while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "401-421",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L401-L421"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Returns future plucks to their ordinary accent rules without weakening notes already struck.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_ds5": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 10",
    "action": "Plays black upper-row key 10, degree re in row octave 2, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "HIKIIRO",
    "action": "Applies 引き色 (Hikiiro, a 40-cent dip recovering over 150 ms) to each live note struck while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1254",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1254"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Stops giving the dip to new plucks while notes already struck complete their captured dip.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "key_fs5": [
   {
    "mode": "upper_row",
    "gesture": "press",
    "short_label": "UPPER 11",
    "action": "Plays black upper-row key 11, degree fa♯ in row octave 3, using the current tuning and instrument.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-31",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L31"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "11",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L11"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/tuning.c",
      "lines": "75-78",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/tuning.c#L75-L78"
     }
    ]
   },
   {
    "mode": "upper_row",
    "gesture": "release",
    "short_label": "NOTE RELEASE",
    "action": "Releases the upper-row note into its Yoin tail, with the same held-note return in mono as white keys.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "570-590",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L570-L590"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "press",
    "short_label": "ATOOSHI",
    "action": "Applies 後押し (Atooshi, a semitone rise starting 200 ms after the pluck) to each live note struck while held.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "30-35",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L30-L35"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1254",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1254"
     }
    ]
   },
   {
    "mode": "ornaments",
    "gesture": "release",
    "short_label": "ORN RELEASE",
    "action": "Stops giving the delayed rise to new plucks while notes already struck keep their captured rise.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "307-314",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L307-L314"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "617-627",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "435-439",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "1244-1275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1275"
     }
    ]
   }
  ],
  "screen": [
   {
    "mode": "home",
    "gesture": "shows",
    "short_label": "HOME PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with ring time, trill rate, vibrato depth and reverb.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "sound",
    "gesture": "shows",
    "short_label": "SOUND PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with low cut, high cut, character and reverb size.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "bend",
    "gesture": "shows",
    "short_label": "BEND PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with up-bend target, down-bend amount, bend time and slide time.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "tuning",
    "gesture": "shows",
    "short_label": "TUNING PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with tuning family, tuning depth, fine tuning and reference A.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "loop",
    "gesture": "shows",
    "short_label": "LOOP PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with loop ruler tempo, ruler length and click.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "trill",
    "gesture": "shows",
    "short_label": "TRILL PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with feel, pair gap, second-stroke strength and oroshi acceleration.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "trill2",
    "gesture": "shows",
    "short_label": "TRILL 2 PAGE",
    "action": "Shows the shared key reference, instrument and scale display, with first-stroke velocity and timing variation.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "489-560",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L489-L560"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "565-612",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L565-L612"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "STATUS",
    "action": "Shows loop-state and enabled-feature tags when space permits, a dot for unsaved edits, temporary action messages and a position bar below the keys while a loop is active or stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "416-465",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L416-L465"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "557-561",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L557-L561"
     }
    ]
   },
   {
    "mode": "safe_mode",
    "gesture": "shows",
    "short_label": "SAFE MODE",
    "action": "No sound; USB stays on for reinstalling and PLAY retries startup.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "177-218",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L177-L218"
     }
    ]
   },
   {
    "mode": "calibration",
    "gesture": "shows",
    "short_label": "CALIBRATION",
    "action": "Prompts for each button and clockwise encoder turn, attempting to save the finished map and abandoning an incomplete attempt after 30 idle seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/panel.c",
      "lines": "47-108",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L47-L108"
     }
    ]
   },
   {
    "mode": "update",
    "gesture": "shows",
    "short_label": "UPDATER",
    "action": "On an OCT-button or USB request, shows UBOOT or UBOOT (USB) before entering the chip updater.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "165-174",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L165-L174"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "319-336",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L319-L336"
     }
    ]
   },
   {
    "mode": "crash",
    "gesture": "shows",
    "short_label": "CRASH",
    "action": "Shows a crash diagnosis and automatically restarts after about four seconds.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "142-162",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L142-L162"
     }
    ]
   },
   {
    "mode": "power_on",
    "gesture": "shows",
    "short_label": "STARTUP",
    "action": "Shows the FuMi-1 splash, and a brief crash notice when a new recorded crash is found.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "231-243",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L231-L243"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "265-275",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L265-L275"
     }
    ]
   },
   {
    "mode": "install_update",
    "gesture": "shows",
    "short_label": "INSTALL",
    "action": "Shows UPDATE with PACKAGE, CHECK HEAD when the package carries M-VAVE’s own update loader, LOADER, CONFIRM or RESTART as installation advances, and FAILED when the attempt stops with an error.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/main.c",
      "lines": "105-116",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/main.c#L105-L116"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/ota.c",
      "lines": "262-265",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L262-L265"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/ota.c",
      "lines": "277-292",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L277-L292"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/ota.c",
      "lines": "322-327",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L322-L327"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/ota.c",
      "lines": "370-377",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L370-L377"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/ota.c",
      "lines": "277-290",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L277-L290"
     }
    ]
   }
  ],
  "jack_midi_in": [
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "MIDI IN",
    "action": "Receives chromatic notes and their velocities on any MIDI channel, plus all-notes-off and all-sound-off messages.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "292-304",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L292-L304"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "289-291",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L289-L291"
     }
    ]
   }
  ],
  "jack_usb": [
   {
    "mode": "any",
    "gesture": "shows",
    "short_label": "USB",
    "action": "Carries chromatic MIDI input, live note output and updater traffic, and during normal release operation sends the master mix to a computer for recording as 16-bit stereo audio at 44.1 kHz.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "292-304",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L292-L304"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "74-85",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L74-L85"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "338-347",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L338-L347"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/main.c",
      "lines": "36-39",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/main.c#L36-L39"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/usb.c",
      "lines": "60-68",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/usb.c#L60-L68"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/usb.c",
      "lines": "183-190",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/usb.c#L183-L190"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/main_fm1.c",
      "lines": "32-41",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L32-L41"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "tools/build.py",
      "lines": "200-205",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/tools/build.py#L200-L205"
     }
    ]
   }
  ]
 },
 "switching_note": {
  "kept_on_unit": "FuMi-1 stores one setup, including instrument, tuning, effects, playing choices, loop ruler and click, plus separate button and encoder calibration; it does not save recorded loop notes, audio, retained layer instruments or a temporary external patch. The current loader accepts its newer setup and converts setups from FuMi-1 1.0.4/1.0.5 in memory, committing the new form only on a later save or autosave. From the flash atlas: install (FuMi update loader): After checking chip key, replaces unequal program sectors only, verifies each, never writes the protected flash head (each successful FuMi installation/update; equal sectors skipped). install (update-record cleanup): After installation, clear only valid update-record sectors. Ordinary saved projects, sounds and samples are not update records (After an install, erase only a 4 KiB sector whose last 256 bytes hold a valid update record (marker 0x5441 at +6 and a matching nonzero CRC16 over bytes 2..79): in practice the family staging-record sector 0xE4000 and, on a first install from stock, stock record sector 0xE8000. Saved music does not hold that record. This loader does not skip 0x97000-0xDFFFF). startup before normal or safe mode: Conditionally erases the entire five-sector update area; foreign bytes count as occupied, not only a FuMi header. No setup/calibration save is performed at startup (expected flash JEDEC accepted and first 4 bytes at E0000 or first 8 at E4F00 contain a non FF byte). update departure, failed update, or dry run: Starting an incoming recognized package erases all five sectors before staging. A refused/failed/dry-run ota_session also erases all five, even if refusal happened before successful staging. Does not ask before erasing foreign data (ota_session entered by installer upgrade request while flash is accepted). return to stock from web installer: Page accepts exactly the SHA256-checked stock V15 package. The firmware accepts the known official loader only if its protected flash-head bytes match the running unit. A comment describes the stock loader as rewriting its full image; that loader implementation is not supplied, so no additional exact stock erase footprint is asserted (owner selects the stock file and starts the return). optional UBOOT recovery tool returns to V15: Reads and saves the entire 1 MiB flash before writes; --write or --ask approval permits only unequal program sectors, high to low, with verification. Device-data area at 93000 and above is carried through this tool, although subsequent stock behavior is not established. This is a stock recovery path, not a restore of a prior FuMi dump (unit in WL82 UBOOT, supported chip/flash, exact approved V15 file, protected head identical, writing requested). What FuMi-1 writes over the previous firmware's data is in overwrites_previous; what the next firmware writes over FuMi-1's is in when_you_leave.",
  "lost": "FoMni’s musical setup is not imported, although its compatible calibration is reused. See the switching advice in this section for the affected saved work. Returning to FoMni does not read the FuMi-1 setup. Whether an older FuMi-1 release reads this release’s saved setup is unverified; write down values before going back a version. Back up before switching. See the switching advice in this section. From the flash atlas: Other firmwares reading FuMi-1's data: FoMni reads and uses FuMi-1's FuMi-1 button and encoder calibration; FiMba-1 beta reads and uses FuMi-1's FuMi-1 button and encoder calibration; Fart Machine One reads and uses FuMi-1's FuMi-1 button and encoder calibration; AMB-1 reads and uses FuMi-1's FuMi-1 button and encoder calibration; Polly reads and uses FuMi-1's FuMi-1 button and encoder calibration. What FuMi-1 reads of other firmwares' data: FuMi-1 reads and uses FoMni's FoMni button calibration; FuMi-1 reads and uses AMB-1's AMB-1 panel calibration; FuMi-1 reads and uses Polly's Polly button and encoder calibration; FuMi-1 reads and uses FiMba-1 beta's FiMba-1 beta panel calibration; FuMi-1 reads and uses Fart Machine One's learned button and encoder calibration. Everything else of another firmware's looks empty or foreign to the reader.",
  "back_up_first": "Before installing or first starting FuMi-1, back up using the firmware that created the work. FuMi-1 has no ordinary setup or loop backup and no restore command: note setup values and, while FuMi-1 runs normally, record its master mix over USB into a computer recorder before switching off; this preserves loop audio rather than editable loop events. The browser audition bench exports its own session and patch choices, not the unit’s setup or loop. The separate recovery tool can read a complete flash image before returning a unit in chip download mode to stock, but excludes the memory-only loop and supplies no FuMi-1 dump restore.",
  "source": [
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/project.c",
    "lines": "33-73",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L33-L73"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/app.h",
    "lines": "12-23",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/app.h#L12-L23"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/panel.c",
    "lines": "37-44",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L37-L44"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/panel.c",
    "lines": "102-108",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L102-L108"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/storage.c",
    "lines": "49-52",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/storage.c#L49-L52"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/storage.c",
    "lines": "112-148",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/storage.c#L112-L148"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/ui.c",
    "lines": "280-287",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L280-L287"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/ui.c",
    "lines": "646-659",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L646-L659"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "245-264",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L245-L264"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/ota.c",
    "lines": "330-395",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/ota.c#L330-L395"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/loader/ldr_core.c",
    "lines": "99-135",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/loader/ldr_core.c#L99-L135"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "tools/fm1_rescue.py",
    "lines": "236-285",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/tools/fm1_rescue.py#L236-L285"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/main.c",
    "lines": "36-39",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/main.c#L36-L39"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/usb.c",
    "lines": "60-68",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/usb.c#L60-L68"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/usb.c",
    "lines": "183-190",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/usb.c#L183-L190"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "32-41",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L32-L41"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "tools/build.py",
    "lines": "200-205",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/tools/build.py#L200-L205"
   }
  ],
  "startup_and_install": "Startup can erase leftover data in the update area without a question, before safe mode as well as ordinary operation; it does so only when its update-area probes find occupied bytes. See the switching advice in this section for the affected saved work. Beginning an installer update also erases this area, including after a refused or failed attempt. Installing replaces the program area; the recommended return through stock has further unverified data risks. The loader also erases any sector in its data scan that contains a valid update record. It does not ask before these erases. These update-area erases also remove X0X’s pending USB restore and Polly’s pending restore information; keep their restore files.",
  "save_overwrites": "The first SAVE or eligible quiet autosave, and every later save, writes a shared setup sector without a question. See the switching advice in this section for the affected saved work. A first save may leave one older copy, but further saves can overwrite both: do not rely on a surviving copy.",
  "calibration_overwrites": "Completing hardware calibration writes immediately without a question. See the switching advice in this section for the affected saved work. Compatible calibration from FoMni, AMB-1, Polly, FiMba-1 and Fart Machine One can instead be reused. An incomplete calibration times out without a flash write; a completed attempt does not report whether its flash save succeeded. These writes can also replace ChoralRoot’s legacy sounds 1–16, kept for returning to ChoralRoot 0.21 or older.",
  "when_you_leave": [
   {
    "to": "stock",
    "name": "Stock V15",
    "flags": "?",
    "weakest_grade": "reported",
    "at_risk": [],
    "possibly_at_risk": [
     "FuMi-1 button and encoder calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): FuMi-1 button and encoder calibration.",
    "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": [
     "FuMi-1 button and encoder calibration"
    ],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Possibly at risk (layout reported or inferred): FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "felucca",
    "name": "Felucca",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if beta 2ND CORE is on and a sound calculation fails or takes too long",
        "effect": "lost"
       },
       {
        "way": "when you change settings from the editor (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a user preset (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you learn MIDI CC assignments (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 run hardware calibration (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": [
     "If no readable older shared settings copy remains, beta 2ND CORE stays OFF by default. These settings do not turn it on."
    ],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration. If no readable older shared settings copy remains, beta 2ND CORE stays OFF by default. These settings do not turn it on.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "sloop",
    "name": "SLOOP",
    "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 SLOOP can still read older SLOOP settings with default MIDI controls and older working music whose drum MIDI channel differs from those settings (FuMi-1’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": "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 sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "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 save the current sound from the editor (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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "x0x",
    "name": "X0X",
    "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 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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "A saved setup from the other firmware can make X0X use defaults for its whole project when you return, including sounds, patterns, song and knob motion. Automatic saving is then on. If you backed up X0X before leaving it, restore that backup after installing X0X; X0X cannot load the older stored copy on its own.",
     "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."
    ],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration. A saved setup from the other firmware can make X0X use defaults for its whole project when you return, including sounds, patterns, song and knob motion. Automatic saving is then on. If you backed up X0X before leaving it, restore that backup after installing X0X; X0X cannot load the older stored copy on its own. 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.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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 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"
       }
      ]
     },
     {
      "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 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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "melodee",
    "name": "Melodee",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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": "FuMi-1 button and encoder calibration",
      "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"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk by itself, under a condition: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FuMi-1 button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "After FoMni saves its setup, going back to FuMi-1 uses its default setup. FuMi-1’s own last save may still be stored, but FuMi-1 will not load it. Later FoMni saves write over it."
    ],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. Carried over: FuMi-1 button and encoder calibration. After FoMni saves its setup, going back to FuMi-1 uses its default setup. FuMi-1’s own last save may still be stored, but FuMi-1 will not load it. Later FoMni saves write over it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "amb",
    "name": "AMB-1",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FuMi-1 button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "The saved button and encoder mapping carries over. This does not import saved pieces, songs, clips or sound choices."
    ],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. Carried over: FuMi-1 button and encoder calibration. The saved button and encoder mapping carries over. This does not import saved pieces, songs, clips or sound choices.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "choralroot",
    "name": "ChoralRoot",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only if a processor failure blocked Dual Core while its saved setting was On",
        "effect": "lost"
       },
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you confirm Reset Settings with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you hold SAVE for a global save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you keep calibration or enter update mode by holding OCT- + OCT+ + HOME for 5 s (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you 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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you confirm Flash Data erase with OCT+ twice (asks first: press again to confirm)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "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)"
   },
   {
    "to": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the controls (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change settings from 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"
       }
      ]
     },
     {
      "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 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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "mvaveopen",
    "name": "M-VAVE FM-1 Open",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you send a complete sample-bank upload through MIDI (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you write the sample bank to the device (the computer asks first)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 sound and playing setup",
      "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": [],
    "owner_text": "At risk when you act: FuMi-1 button and encoder calibration; FuMi-1 sound and playing setup.",
    "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": "FuMi-1 sound and playing setup",
      "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: FuMi-1 sound and playing setup. 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup.",
    "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": "FuMi-1 sound and playing setup",
      "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: FuMi-1 sound and playing setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "polly",
    "name": "Polly",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FuMi-1 button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "The saved button and encoder mapping carries over. This does not import saved pieces, songs, clips or sound choices.",
     "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: FuMi-1 sound and playing setup. Carried over: FuMi-1 button and encoder calibration. The saved button and encoder mapping carries over. This does not import saved pieces, songs, clips or sound choices. 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": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "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": "lost"
       },
       {
        "way": "when you calibrate the panel or change editor preferences (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you confirm RESET SETTINGS (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"
       }
      ]
     },
     {
      "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, import, erase or rename a user sound (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)"
   },
   {
    "to": "sloopdx",
    "name": "sloopDX",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when 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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose FACTORY RESET in ABOUT and confirm (asks first: press again to confirm)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save the current sound from the editor (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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "rainbow",
    "name": "Rainbow Mode",
    "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)"
   },
   {
    "to": "duell",
    "name": "DUELL beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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": "FuMi-1 button and encoder calibration",
      "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: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration. 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": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE briefly (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FuMi-1 button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "After FiMba-1 saves its setup, going back to FuMi-1 uses its default setup. FuMi-1’s own last save may still be stored, but FuMi-1 will not load it. Later FiMba-1 saves write over it."
    ],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. Carried over: FuMi-1 button and encoder calibration. After FiMba-1 saves its setup, going back to FuMi-1 uses its default setup. FuMi-1’s own last save may still be stored, but FuMi-1 will not load it. Later FiMba-1 saves write over it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "maku",
    "name": "MAKU",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "when you hold OCT- and OCT+ while powering on (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: FuMi-1 sound and playing setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fart",
    "name": "Fart Machine One",
    "flags": "K",
    "weakest_grade": "read-in-source",
    "at_risk": [],
    "possibly_at_risk": [],
    "carried_over": [
     "FuMi-1 button and encoder calibration"
    ],
    "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": "Carried over: FuMi-1 button and encoder calibration. 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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 favourites or their filter (without asking)",
        "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 save a chord preset (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you 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 user sound (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 send, store or erase a user sound directly with a MIDI tool (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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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": "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 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": "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 save the current sound from the editor (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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "jangada",
    "name": "Jangada",
    "flags": "AS",
    "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 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": "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 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": "lost"
       },
       {
        "way": "when you send a user sound from the editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send user sounds to Jangada with a computer tool, without the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you store a user 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)"
   },
   {
    "to": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the buttons and knob at power-on; cancelling also requests a settings save (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you change a favourite mark or the filter for favourites (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you erase a starred user sound, which also removes its favourite mark (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 run MENU calibration, then close MENU (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send MENU settings, display preferences or favourite changes 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 sound (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)"
   },
   {
    "to": "orbit",
    "name": "ORBIT",
    "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 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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you choose SAVE > USER > SAVE or ERASE and repeat the action (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "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 user sound from the web editor (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "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": "lost"
       },
       {
        "way": "when you store a user sound from the web 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)"
   },
   {
    "to": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "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": "lost"
       },
       {
        "way": "when you save the current sound from the editor (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"
       }
      ]
     }
    ],
    "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)"
   },
   {
    "to": "winampfm",
    "name": "winampFM Synth",
    "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 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": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a user-sound bank directly with a MIDI tool (without asking; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you save or erase a user sound with a USER GO knob (asks or waits for you to turn again for that slot only; writes the whole bank)",
        "effect": "lost"
       },
       {
        "way": "when you send, store or erase a user sound directly with a MIDI tool (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)"
   },
   {
    "to": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically at first start",
        "effect": "lost"
       },
       {
        "way": "automatically during use (its autosave is on by default)",
        "effect": "lost"
       },
       {
        "way": "automatically, only when older Bubba settings or patterns cause it to reset the space holding your data (with older patterns, takes and sounds are kept)",
        "effect": "lost"
       },
       {
        "way": "when you load or remove a screen language pack (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "salt",
    "name": "Felucca [Salt]",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you erase a user sound (asks first or waits for you to turn again)",
        "effect": "lost"
       },
       {
        "way": "when you run hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send display or favourite changes from the editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you save a user sound (asks or waits for you to turn again for that slot only; 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)"
   },
   {
    "to": "pigeon",
    "name": "PIGEON",
    "flags": "ACS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "automatically, only when playback stops after you learn or clear a MIDI mapping",
        "effect": "lost"
       },
       {
        "way": "when you calibrate the panel (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you send preferences from the web editor (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you restore a PIGEON archive with the library tool (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you restore a PIGEON session in its editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore a backup from the older editor (the computer asks once before restoring the whole backup)",
        "effect": "lost"
       },
       {
        "way": "when you restore compatible backup data with another MIDI tool (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: FuMi-1 sound and playing setup. At risk when you act: FuMi-1 button and encoder calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1move",
    "name": "FM1 Move",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 button and encoder calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you import a preset file from the device page (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 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": "lost"
       },
       {
        "way": "when you store a user sound from the device page (without asking; writes the whole bank)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "FuMi-1 sound and playing setup",
      "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"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk when you act: FuMi-1 button and encoder calibration; FuMi-1 sound and playing setup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "to": "fm1quest",
    "name": "FM1 Quest",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FuMi-1 sound and playing setup",
      "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": "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 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": "lost"
       },
       {
        "way": "when you save the current sound from the editor (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, save or erase a user sound with computer commands (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)"
   },
   {
    "to": "grooveos",
    "name": "Groove OS",
    "flags": "?",
    "weakest_grade": null,
    "at_risk": [],
    "possibly_at_risk": [
     "FuMi-1 sound and playing setup",
     "FuMi-1 button and encoder calibration"
    ],
    "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): FuMi-1 sound and playing setup; FuMi-1 button and encoder calibration. 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)"
   }
  ],
  "foreign_consequences_evidence": "inferred from FuMi-1 write behavior and the checked foreign layouts; not tested on a unit",
  "foreign_layout_sources": [
   "flash-atlas/atlas.json",
   "refresh/work/fm106.storage.json",
   "refresh/work/hortator.storage.json",
   "refresh/work/obervave.storage.json",
   "refresh/work/polly.storage.json",
   "refresh/work/skiff.storage.json",
   "refresh/work/sloopdx.storage.json",
   "refresh/work/zp12.storage.json",
   "refresh/work/rainbow.storage.json",
   "refresh/work/duell.storage.json",
   "refresh/work/fimba.storage.json",
   "refresh/work/maku.storage.json",
   "refresh/work/fart.storage.json"
  ],
  "before_leaving": "See the switching advice in this section. Back up or note your values 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": [
     "At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase stock data in that space. The exact locations of stock saved data are only reported."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): stock settings (and possibly patterns). At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase stock data in that space. The exact locations of stock saved data are only reported.",
    "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": [
     "At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase Baud Girl’s saved work if it sits in that space, including the checked spots. Exact saved-data locations are unknown."
    ],
    "owner_text": "Possibly at risk (layout reported or inferred): Baud Girl presets (128); Baud Girl patterns (16, with locks). At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase Baud Girl’s saved work if it sits in that space, including the checked spots. Exact saved-data locations are unknown.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "felucca",
    "name": "Felucca",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, button calibration, favourites, MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1-16",
      "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: settings, button calibration, favourites, MIDI LEARN map. At risk when you act: user presets 1-16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloop",
    "name": "SLOOP",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "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: settings, calibration, song order, SYN1-4 kits, MIDI LEARN, theme and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "x0x",
    "name": "X0X",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "the whole X0X project (settings, sound, all 32 patterns, song, knob motion)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "X0X button calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Before leaving X0X, stop playback and back up its project over USB. One save or automatic save in FuMi-1 can make X0X load defaults for its whole project when you return, including sounds, patterns, song and knob motion. Restore the X0X backup after reinstalling X0X; the older stored copy cannot be used as a backup."
    ],
    "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. Before leaving X0X, stop playback and back up its project over USB. One save or automatic save in FuMi-1 can make X0X load defaults for its whole project when you return, including sounds, patterns, song and knob motion. Restore the X0X backup after reinstalling X0X; the older stored copy cannot be used as a backup.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jiant",
    "name": "JIANT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, favourites, MENU options",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "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: settings, calibration, favourites, MENU options. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "melodee",
    "name": "Melodee",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, factory favourites, calibration, saved template",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared user presets U001-U018",
      "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: settings, factory favourites, calibration, saved template. At risk when you act: shared user presets U001-U018.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fomni",
    "name": "FoMni",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "FoMni setup (pages, chord buttons, lights)",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FoMni button calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "After FuMi-1 saves its setup, going back to FoMni uses its default setup. FoMni’s own last save may still be stored, but FoMni will not load it. Later FuMi-1 saves write over it."
    ],
    "owner_text": "At risk by itself: FoMni setup (pages, chord buttons, lights). Carried over: FoMni button calibration. After FuMi-1 saves its setup, going back to FoMni uses its default setup. FoMni’s own last save may still be stored, but FoMni will not load it. Later FuMi-1 saves write over it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "amb",
    "name": "AMB-1",
    "flags": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "AMB-1 pieces and setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "AMB-1 panel calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: AMB-1 pieces and setup. Carried over: 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "options, playing setup and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: options, playing setup and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "ghoulbox",
    "name": "GHOULBOX",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "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: settings and panel calibration. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "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 sample audio reaches a checked spot where firmware updates are prepared and leaves data there",
        "effect": "lost"
       },
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       },
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       },
       {
        "way": "when you install another firmware or an update while FuMi-1 is running",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 2",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 3",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 4",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 5",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 6",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 7",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 8",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 9",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 10",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 11",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 12",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 13",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 14",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 15",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open USER project 16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "Open device preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Installing replaces Open’s sixteen USER projects, preferences and the information needed to read its sample bank, including the start of its sample storage. Export projects and the device sample bank before leaving Open. The required return through stock firmware has other unchecked data risks.",
     "At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase Open sample audio if the bank reaches that far. Export the device sample bank before leaving Open."
    ],
    "owner_text": "At risk by itself: Open shared sample audio. At risk when you act: Open USER project 1; Open USER project 2; Open USER project 3; Open USER project 4; Open USER project 5; Open USER project 6; Open USER project 7; Open USER project 8; Open USER project 9; Open USER project 10; Open USER project 11; Open USER project 12; Open USER project 13; Open USER project 14; Open USER project 15; Open USER project 16; Open device preferences. Installing replaces Open’s sixteen USER projects, preferences and the information needed to read its sample bank, including the start of its sample storage. Export projects and the device sample bank before leaving Open. The required return through stock firmware has other unchecked data risks. At start-up, FuMi-1 erases the space where firmware updates are prepared if a checked spot there holds data. This can erase Open sample audio if the bank reaches that far. Export the device sample bank before leaving Open.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm106",
    "name": "FM-106",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "octave, last selected preset and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: octave, last selected preset and MIDI preferences.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "hortator",
    "name": "Hortator",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and panel calibration.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "obervave",
    "name": "OberVave",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "saved programs and global settings",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "ASK",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "Polly setup and channel sounds",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "Polly button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: Polly setup and channel sounds. Carried over: 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sound bank 1",
      "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: settings, calibration and favourites. At risk when you act: user sound bank 1.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopdx",
    "name": "sloopDX",
    "flags": "AS",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user presets 1–16",
      "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: settings, calibration, song order, MIDI, theme and favourites. At risk when you act: user presets 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "rainbow",
    "name": "Rainbow Mode",
    "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)"
   },
   {
    "from": "duell",
    "name": "DUELL beta",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and panel setup",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved patches",
      "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: settings and panel setup. At risk when you act: saved patches.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fimba",
    "name": "FiMba-1 beta",
    "flags": "ASK",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [
     "FiMba-1 beta panel calibration"
    ],
    "kept_unseen": [],
    "notes": [
     "After FuMi-1 saves its setup, going back to FiMba-1 uses its default setup. FiMba-1’s own last save may still be stored, but FiMba-1 will not load it. Later FuMi-1 saves write over it."
    ],
    "owner_text": "At risk by itself: FiMba-1 beta sound and playing setup. Carried over: FiMba-1 beta panel calibration. After FuMi-1 saves its setup, going back to FiMba-1 uses its default setup. FiMba-1’s own last save may still be stored, but FiMba-1 will not load it. Later FuMi-1 saves write over it.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "maku",
    "name": "MAKU",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings and calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "inherited user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "At risk by itself: settings and calibration. At risk when you act: inherited user preset bank 1.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fart",
    "name": "Fart Machine One",
    "flags": "K",
    "weakest_grade": "read-in-source",
    "at_risk": [],
    "possibly_at_risk": [],
    "carried_over": [
     "learned button and encoder calibration"
    ],
    "kept_unseen": [],
    "notes": [],
    "owner_text": "Carried over: 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": "AS",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "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: settings, panel calibration, four chord preset setups and the current chord setup. At risk when you act: user sounds 1-16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "sloopbanks",
    "name": "SLOOP DX7 Banks",
    "flags": "AS",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "Saving a FuMi-1 project can remove DX7 Banks’ saved count of DX banks already set up. An older copy of the settings can survive the first save. Without that count, DX7 Banks erases DX banks 1–8 at its next start without asking, including your own banks 5–8. Back up your DX banks before switching."
    ],
    "owner_text": "At risk by itself: settings, calibration, song order, synthesized drum kits and DX-bank setup. At risk when you act: user sounds 1–16. Saving a FuMi-1 project can remove DX7 Banks’ saved count of DX banks already set up. An older copy of the settings can survive the first save. Without that count, DX7 Banks erases DX banks 1–8 at its next start without asking, including your own banks 5–8. Back up your DX banks before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "jangada",
    "name": "Jangada",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, calibration and MIDI LEARN map",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "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: preferences, calibration and MIDI LEARN map. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "waveloop",
    "name": "WaveLoop FM-1",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1–16",
      "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: settings, calibration and favourites. At risk when you act: user sounds 1–16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "orbit",
    "name": "ORBIT",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "saved section A",
      "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": "when you press SAVE (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": "saved section B",
      "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": "when you press SAVE (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": "saved section C",
      "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": "when you press SAVE (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": "saved section D",
      "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": "when you press SAVE (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": "working music 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": "when you press SAVE (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": "USER sounds U01-U16",
      "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: settings, calibration, song order, SYN1-SYN4 kits and MIDI preferences; 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); 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); 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); 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); 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). At risk when you act: USER sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "floyd",
    "name": "SLOOP Floyd FM",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "settings, panel calibration and song order",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "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: settings, panel calibration and song order. At risk when you act: user sounds U01–U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "winampfm",
    "name": "winampFM Synth",
    "flags": "AS",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds 1-16",
      "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: settings, panel calibration, song order, SYN kits and MIDI. At risk when you act: user sounds 1-16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "bubba",
    "name": "Bubba Machine (beta)",
    "flags": "S",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "screen language pack",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "system preferences and last pattern",
      "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 when you act: 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": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "screen preferences, calibration and favourites",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01-U16",
      "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: screen preferences, calibration and favourites. At risk when you act: user sounds U01-U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "pigeon",
    "name": "PIGEON",
    "flags": "AS",
    "weakest_grade": "read-in-source",
    "at_risk": [
     {
      "object": "preferences, MIDI LEARN and panel calibration",
      "effect": "lost",
      "ways": [
       {
        "way": "automatically during use",
        "effect": "lost"
       },
       {
        "way": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "shared song and drum sample bank",
      "effect": "lost",
      "ways": [
       {
        "way": "when you install FuMi-1",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "older user preset bank 1",
      "effect": "lost",
      "ways": [
       {
        "way": "when you complete hardware calibration (without asking)",
        "effect": "lost"
       }
      ]
     }
    ],
    "possibly_at_risk": [],
    "carried_over": [],
    "kept_unseen": [],
    "notes": [
     "If your PIGEON sample bank reaches the storage that installing FuMi-1 writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching."
    ],
    "owner_text": "At risk by itself: preferences, MIDI LEARN and panel calibration. At risk when you act: shared song and drum sample bank; older user preset bank 1. If your PIGEON sample bank reaches the storage that installing FuMi-1 writes over, PIGEON can no longer read any of the bank, either song or the kit. Export the PIGEON session and audio bank before switching.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1move",
    "name": "FM1 Move",
    "flags": "AS",
    "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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "when you press SAVE (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": "user sounds U01–U16",
      "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: 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 when you act: user sounds U01–U16.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   },
   {
    "from": "fm1quest",
    "name": "FM1 Quest",
    "flags": "AS",
    "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": "when you press SAVE (without asking)",
        "effect": "lost"
       }
      ]
     },
     {
      "object": "user sounds U01–U16",
      "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: settings, panel mapping, song order and Quest preferences/progress. At risk when you act: user sounds U01–U16.",
    "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": [
     "Where Groove OS saves data and which firmware can read it are not public. Back up its projects and your own sounds separately before switching. It is not known whether they survive this switch."
    ],
    "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. Where Groove OS saves data and which firmware can read it are not public. Back up its projects and your own sounds separately before switching. It is not known whether they survive this switch.",
    "source": "flash-atlas derived/matrix.json (generated by apply_to_maps.py; do not edit by hand)"
   }
  ]
 },
 "disagreements": [
  {
   "topic": "Other firmware calibration",
   "docs_say": "The installation section says other firmwares’ saved data is not read.",
   "source_says": "Musical setups from FoMni are rejected, but compatible saved panel calibration can be read from the shared area.",
   "docs_ref": {
    "kind": "doc",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "README.md",
    "lines": "51-52",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/README.md#L51-L52"
   },
   "source_ref": {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/panel.c",
    "lines": "37-44",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L37-L44"
   },
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/panel.c",
     "lines": "37-44",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/panel.c#L37-L44"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/project.c",
     "lines": "51-70",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L51-L70"
    }
   ]
  },
  {
   "topic": "Slide cannot be enabled on the panel",
   "docs_say": "The feature list includes mono with slide.",
   "source_says": "Slide time has a knob, but slide defaults off and no panel handler enables it.",
   "docs_ref": {
    "kind": "doc",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "README.md",
    "lines": "21-26",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/README.md#L21-L26"
   },
   "source_ref": {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "34",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L34"
   },
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "34",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L34"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "19-26",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L19-L26"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/app/ui.c",
     "lines": "254-289",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L254-L289"
    }
   ]
  },
  {
   "topic": "Oroshi in loop playback",
   "docs_say": "The guide says a recorded trill uses Oroshi during replay.",
   "source_says": "Loop ornament trills repeat without the accelerating Oroshi start, which is restricted to live playing.",
   "docs_ref": {
    "kind": "doc",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "README.md",
    "lines": "170",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/README.md#L170"
   },
   "source_ref": {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "1201-1210",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1201-L1210"
   },
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "741-744",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L741-L744"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "1201-1210",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1201-L1210"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "415-418",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L415-L418"
    }
   ]
  },
  {
   "topic": "Ornament release",
   "docs_say": "The ornament introduction says techniques end when released.",
   "source_says": "Hikiiro and Atooshi are captured by each pluck; releasing their keys stops new notes receiving the shape but does not cancel shapes already captured, and damping is irreversible.",
   "docs_ref": {
    "kind": "doc",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "README.md",
    "lines": "122-135",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/README.md#L122-L135"
   },
   "source_ref": {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "435-439",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
   },
   "source": [
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "435-439",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L435-L439"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "1244-1254",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1244-L1254"
    },
    {
     "kind": "source",
     "repo": "cartesive/fumi-1",
     "ref": "fumi-1.0.7",
     "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
     "path": "firmware/src/dsp/fumi.c",
     "lines": "617-627",
     "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L617-L627"
    }
   ]
  }
 ],
 "not_mapped": [
  "The browser audition bench and computer keyboard shortcuts are separate interfaces; their session and patch exports are not unit setup or loop backups.",
  "No panel selector was found for lights, MIDI output enable, output Level, vibrato rate, USER per-degree trims or slide enable; these stored parameters are not invented as panel controls.",
  "A full checkout of the recorded upstream base b81eb6b661c35948ec2d1059664d4e5790999305 was not supplied; the complete tree comparison uses the supplied FoMni v0.4 tree, with the recorded base and protected-path intent read in docs/upstream.md and tools/guard_platform.sh.",
  "Whether older FuMi releases accept the setup written by this release is not established by the supplied tree; current code reads formats 2 and 3 and always writes format 3."
 ],
 "lights": {
  "button_home": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "The Home page is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_fx": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "The Sound page is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_edit": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "The Bend page is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_sel": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "The Tuning page is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_env": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE",
    "action": "The Loop page is showing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_glo": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "PAGE / MONO",
    "action": "The Trill or Trill 2 page is showing or mono playing is enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "615-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L615-L633"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_lfo": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "VIB ON",
    "action": "Vibrato is latched on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "626-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L626-L633"
     }
    ]
   }
  ],
  "button_save": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_arp": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "TRILL ON",
    "action": "Trill is latched on.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "626-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L626-L633"
     }
    ]
   }
  ],
  "button_seq": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   },
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "ORN ON",
    "action": "Black keys are in ornament mode.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "626-633",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L626-L633"
     }
    ]
   }
  ],
  "button_rec": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   },
   {
    "mode": "loop_armed",
    "gesture": "blinking",
    "short_label": "ARMED",
    "action": "Blinks on alternating 250 ms intervals while waiting for the first note key.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "621-622",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L621-L622"
     }
    ]
   },
   {
    "mode": "loop_recording",
    "gesture": "lit",
    "short_label": "RECORDING",
    "action": "The first take is recording.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "621-622",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L621-L622"
     }
    ]
   },
   {
    "mode": "loop_overdub",
    "gesture": "lit",
    "short_label": "OVERDUB",
    "action": "A loop layer is being overdubbed.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "621-622",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L621-L622"
     }
    ]
   }
  ],
  "button_oct_down": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_oct_up": [
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "GLOW",
    "action": "Unlit buttons glow faintly when the saved light preference enables button glow, which is the default and has no panel selector here.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L643"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "42-71",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L42-L71"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/project.c",
      "lines": "7-15",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/project.c#L7-L15"
     }
    ]
   }
  ],
  "button_play_stop": [
   {
    "mode": "loop_playback",
    "gesture": "lit",
    "short_label": "PLAYING",
    "action": "The loop is playing.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "623-625",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L623-L625"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-65",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L46-L65"
     }
    ],
    "light": "green"
   },
   {
    "mode": "loop_overdub",
    "gesture": "lit",
    "short_label": "DUBBING",
    "action": "The loop is playing while an overdub is recorded.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "623-625",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L623-L625"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-65",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L46-L65"
     }
    ],
    "light": "red"
   },
   {
    "mode": "loop_recording",
    "gesture": "dim",
    "short_label": "TAKE GLOW",
    "action": "The red PLAY lamp receives only background glow during the first take when button glow is enabled.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "621-625",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L621-L625"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "54-65",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L54-L65"
     }
    ],
    "light": "red"
   },
   {
    "mode": "any",
    "gesture": "dim",
    "short_label": "IDLE GLOW",
    "action": "With button glow enabled, the green PLAY lamp glows faintly while the loop is empty, armed or stopped.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/plat_fm1.c",
      "lines": "46-65",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/plat_fm1.c#L46-L65"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "621-643",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L621-L643"
     }
    ],
    "light": "green"
   }
  ],
  "key_lights": [
   {
    "mode": "any",
    "gesture": "lit",
    "short_label": "KEY GUIDE",
    "action": "With key lights enabled, white keys 1, 6, 11 and 16 stay lit as landmarks and other note keys light above the voice-level threshold, including loop notes.",
    "evidence": "read-in-source",
    "source": [
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/app/ui.c",
      "lines": "634-640",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L634-L640"
     },
     {
      "kind": "source",
      "repo": "cartesive/fumi-1",
      "ref": "fumi-1.0.7",
      "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
      "path": "firmware/src/dsp/fumi.c",
      "lines": "318-329",
      "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L318-L329"
     }
    ]
   }
  ]
 },
 "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"
  ]
 },
 "saving_note": {
  "power_off": "Power-off writes nothing; the loop is lost and unsaved setup edits can be lost.",
  "autosave": "An edit must mark the setup unsaved, all keys and buttons must be released, no voices may remain, the loop must be empty or stopped, and four seconds must have elapsed on the activity timer; KNOB 1–4 and button activity reset it, but SELECT, PRESETS and ALGORITHM do not.",
  "update": "SAVE before updating; if an update returns without installing, reinitialising the UI clears the unsaved flag without saving the pending setup, so use SAVE again before powering off.",
  "source": [
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/ui.c",
    "lines": "646-659",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L646-L659"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/ui.c",
    "lines": "361-375",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/ui.c#L361-L375"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/main_fm1.c",
    "lines": "338-344",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/main_fm1.c#L338-L344"
   }
  ]
 },
 "loop_limits": {
  "capacity": "The loop has room for 1,024 events, reserving space for releases; when room is low, further presses and ornament or bend starts still sound live but are silently omitted from the recording.",
  "instruments": "Up to eight distinct instruments can be retained by layers; a new layer beyond that follows the live PRESETS choice instead.",
  "recording": "Only panel note keys, ornament keys and bend actions are captured; knobs, MASTER, LFO, ARP, GLO and incoming MIDI notes are not recorded.",
  "backup": "The loop is held only in memory, has no export, and is excluded from SAVE; undo removes layers without redo and clear has no undo.",
  "source": [
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "636-647",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L636-L647"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "684-713",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L684-L713"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "907-934",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L907-L934"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/dsp/fumi.c",
    "lines": "1100-1139",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/dsp/fumi.c#L1100-L1139"
   },
   {
    "kind": "source",
    "repo": "cartesive/fumi-1",
    "ref": "fumi-1.0.7",
    "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
    "path": "firmware/src/app/app.h",
    "lines": "18-23",
    "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/firmware/src/app/app.h#L18-L23"
   }
  ]
 },
 "delta": {
  "parent": "FoMni v0.4",
  "parent_map": "control-maps/fomni.json",
  "parent_commit": "6ecd227013cc18def0e89d035b3760eb268b342b",
  "fork_point": "FoMni's platform (not a GitHub fork; README says it is built on FoMni's platform and guards those files against upstream FoMni)",
  "entries_carried_unchanged": 2,
  "entries_changed": 99,
  "entries_new": 91,
  "entries_dropped": 51,
  "modes_carried": 3,
  "modes_new": 18,
  "modes_dropped": 4
 },
 "delta_counting": "Counts cover control and light entries; unchanged means all fields except citations match, changed pairs a parent entry with its replacement, and dropped has no replacement; modes carried retain sound, power_on and safe_mode ids with rewritten descriptions.",
 "storage_fragment": "refresh/work/fumi.storage.json",
 "delta_evidence": [
  {
   "kind": "source",
   "repo": "cartesive/fumi-1",
   "ref": "fumi-1.0.7",
   "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
   "path": "docs/upstream.md",
   "lines": "1-16",
   "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/docs/upstream.md#L1-L16"
  },
  {
   "kind": "source",
   "repo": "cartesive/fumi-1",
   "ref": "fumi-1.0.7",
   "commit": "c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d",
   "path": "tools/guard_platform.sh",
   "lines": "3-16",
   "url": "https://github.com/cartesive/fumi-1/blob/c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d/tools/guard_platform.sh#L3-L16"
  }
 ],
 "refresh_check_fixes": [
  {
   "round": 1,
   "error": "1 SLOOP kits and song order",
   "fixed": "Named SLOOP song order and all four sixteen-sound SYN1–SYN4 kits, plus sloopDX song order, in the immediate SAVE and quiet-autosave loss warning.",
   "at": "switching_note.save_overwrites; fumi.md: Before you switch firmware"
  },
  {
   "round": 1,
   "error": "2 USB audio and recording route",
   "fixed": "Broadened the USB label and entry to cover the default stereo audio stream and added USB recording to the owner and storage-fragment backup advice.",
   "at": "controls.jack_usb[0]; switching_note.back_up_first; refresh/work/fumi.storage.json:backup_note; fumi.md"
  },
  {
   "round": 1,
   "error": "3 DUELL saved patches",
   "fixed": "Replaced the incorrect ordinal storage-chunk wording with the actual saved-patch loss, including the fragment consequence text.",
   "at": "switching_note.calibration_overwrites; refresh/work/fumi.storage.json:reads_foreign[47].what_happens; fumi.md"
  },
  {
   "round": 1,
   "error": "4 Empty overdub undo",
   "fixed": "Changed the threshold gesture to long_press and stated that undo ends overdubbing, with playback or an empty loop as the resulting state.",
   "at": "controls.button_play_stop[7]; fumi.md: Record, overdub and undo a phrase"
  },
  {
   "round": 1,
   "error": "5 Click direction",
   "fixed": "Replaced toggle wording with clockwise on and counter-clockwise off.",
   "at": "controls.encoder_knob3[4]; fumi.md: Loop page"
  },
  {
   "round": 1,
   "error": "6 GLO light label",
   "fixed": "Changed the label to PAGE / MONO and named both meanings beside the owner light row.",
   "at": "lights.button_glo[0].short_label; fumi.md: Read the lights"
  },
  {
   "round": 1,
   "error": "7 Owner text rendering",
   "fixed": "Replaced the garbled key-light name and translated simultaneous and power-on gestures into panel language.",
   "at": "fumi.md: Use MIDI and recognise special screens; Read the lights"
  },
  {
   "round": 1,
   "error": "8 Missing light and mode routes",
   "fixed": "Appended the green PLAY background-glow entry and completed chip-updater and Empty-loop entry routes.",
   "at": "lights.button_play_stop[3]; modes[18]; modes[9]; fumi.md"
  },
  {
   "round": 1,
   "error": "8 Additional coverage findings",
   "fixed": "Appended installation progress, named the loop-position bar, explained the retained octave change after a cancelled updater gesture, and qualified its UBOOT screen.",
   "at": "modes[20]; controls.screen[13]; controls.screen[7]; controls.screen[10]; controls.button_oct_down[3]; controls.button_oct_up[3]; fumi.md"
  },
  {
   "round": 1,
   "error": "8 Oroshi deciding citation",
   "fixed": "Made the live-only group condition the primary source for the confirmed Oroshi disagreement.",
   "at": "disagreements[2].source_ref"
  },
  {
   "round": 1,
   "error": "1 Switching-table status",
   "fixed": "Attached the missing-table notice and backup advice directly to each flash-atlas pointer.",
   "at": "switching_note.lost; switching_note.when_you_leave; fumi.md"
  },
  {
   "round": 1,
   "error": "8 Delta counts",
   "fixed": "Recomputed carry, change and new-entry totals after editing the two updater entries and appending coverage.",
   "at": "delta"
  },
  {
   "round": 2,
   "error": "1 CHECK HEAD condition",
   "fixed": "Explained that CHECK HEAD applies to packages carrying M-VAVE’s official update loader, including packages other than a stock-firmware return.",
   "at": "controls.screen[13]; fumi.md: Installation progress"
  },
  {
   "round": 2,
   "error": "Unnumbered note Empty-loop routes",
   "fixed": "Moved the Empty-loop routes into the looper section and clarified that undo empties the loop when its only completed layer is removed.",
   "at": "fumi.md: Record, overdub and undo a phrase"
  },
  {
   "round": "overlay-fix-r1",
   "at": "controls.button_oct_down[3].short_label",
   "old": "UPDATE 5S",
   "new": "UPDATE 5s",
   "why": "firmware/src/app/main_fm1.c:319-336@c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d"
  },
  {
   "round": "overlay-fix-r1",
   "at": "controls.button_oct_up[3].short_label",
   "old": "UPDATE 5S",
   "new": "UPDATE 5s",
   "why": "firmware/src/app/main_fm1.c:319-336@c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d"
  },
  {
   "round": "overlay-fix-r1",
   "at": "controls.button_play_stop[5].short_label",
   "old": "START LOOP",
   "new": "START",
   "why": "firmware/src/app/ui.c:215-225@c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d"
  },
  {
   "round": "overlay-fix-r1",
   "at": "controls.button_play_stop[3].short_label",
   "old": "STOP LOOP",
   "new": "STOP",
   "why": "firmware/src/app/ui.c:215-225@c83d2c4ab1d8a2c8e0b6d5aabe8d9bf2dd81896d"
  }
 ]
}