Cadenza (n.): a brilliant, technically demanding solo passage — calling for precision timing and controlled technique.
.vil file is always attached to the
latest release.
| Problem with QWERTY | Cadenza solution |
|---|---|
High same-finger bigrams (ed, ce…) | Colemak-DH distributes load evenly across all fingers |
| Common letters on weak fingers | All 5 most-frequent English letters (E T A O I) on home row |
| Lateral stretch for B, Y, H | Colemak-DH eliminates lateral index movement |
| Ctrl/Shift require leaving home row | Hold A=⌘ · S=⌃ · T=⇧ · R=⌥ — no finger leaves home |
| Number row forces arm travel | Dedicated L5 on thumb hold — zero arm movement |
| Symbol keys scattered far from home | All symbols via L4 from home position, frequency-ranked |
| Wide keyboard forces arms apart | Corne Choc split form aligns with natural shoulder width |
| No WM integration | L11 (WS 1–4) and L12 (WS 1–10) dedicated tiling WM layers |
| German umlauts require OS workarounds | L10 International with bilateral access and direct RALT keycodes |
Colemak reduces finger travel by 50–70% compared to QWERTY for typical English text. Combined with a 36-key split layout, total finger and wrist movement drops dramatically.
| Feature | Miryoku | Cadenza v1.0.0 |
|---|---|---|
| HRM implementation | MT() — global tipping term | Tap Dance — per-key tipping terms (200/250 ms) |
| Symbol layer design | Shifted symbols at numpad positions | Frequency+Strength ranking — most-used symbol on strongest finger |
| Bracket access | Scattered across layers | L8: tap=open, hold=close, both halves, symmetric |
| Code & CLI layer | Not standard | L9: shell operators, path navigation TD, expansion macros |
| German / International | No support | L10: bilateral access, ß/€ via RALT, " dead key on both T and N |
| Tiling WM integration | None | L11 (WS 1–4 reflex) + L12 (WS 1–10 full map, numpad memory) |
| Layer access keys | Thumb-only | Priority-ranked: Frequency × Ergonomic quality |
| Access key symmetry | Left-biased | L7/L8/L9/L10/L11 reachable from either hand |
| Inner column rule | G/M used for layer content | G/M never used for layer content (lateral stretch rule) |
| RGB & Media | Fixed thumb access | Hold W/Y (ring top) — all 6 thumbs free while on layer |
The Miryoku numpad-position grid for symbols has no ergonomic basis on a split layout. Cadenza v1.0.0 replaces it with a deliberate ranking: symbols are sorted by daily usage frequency in German IT writing contexts (code, config, e-mail, documentation), then assigned to fingers in strength order. = (most frequent) goes to T (strongest left index). & (least frequent of the eight) goes to O (weakest right pinky).
The previous Esc-based access blocked the entire left thumb cluster while the layer was held. W and Y (ring finger, top row) leave all six thumb keys free — which is essential since both thumb clusters are used for Mode/Toggle/RGB and Mute/Play/Stop. The top-row position is an acceptable trade-off for the functional necessity.
The right thumb cluster sits in a slight arc on the Corne Choc. Bsp (middle position) requires no lateral thumb movement — it is a direct vertical press. Ent (inner position) requires a slight inward reach. Since Symbols is the second most-used layer (after Navigation), it earns the easier key.
Previously L10 used X/. (ring fingers) for access and had content only on the right side. In v1.0.0, D/H (index fingers) were promoted for access — the strongest symmetric bottom-row pair. Left side now has full content (−, €, ß, " dead key), accessible when the right index holds H. The " dead key for umlauts appears on both T (left) and N (right) via TD33, so umlaut input is possible regardless of which hand holds the layer.
L11 provides reflex access to WS 1–4 — the four workspaces used in most daily workflows. L12 provides the full WS 1–10 map using the numpad muscle memory from L5 Numbers. The L key (right index, top row) was chosen for L12 because it leaves the left hand entirely free for workspace number selection. Both layers share identical right-side content (focus, window movement, kill/float/fullscreen) for consistent muscle memory.
v1.0.0 requires a custom Vial-QMK firmware build with TAP_DANCE_ENTRIES 48 (up from the default 32). The Corne Choc Pro RP2040 flash procedure: double-tap reset → RPI-RP2 drive appears → copy .uf2 file → done. No special tools required. After flashing, Vial connects as before and all programmed keys are preserved in EEPROM.
Access key priority is determined by usage frequency × ergonomic quality. For a German-primary IT consultant: International > Symbols > Numbers > Code/CLI > Clipboard > Tiling WM > Brackets > RGB/Media > Mouse > F-keys.
| Layer | Name | Access key(s) | Type | Notes |
|---|---|---|---|---|
| L0 | Base | — | Always active | Colemak-DH + Tap Dance HRM |
| L1 redesigned | RGB & Media | Hold W · Hold Y | Ring top · MO(1) | Leaves all thumbs free on layer |
| L2 | Navigation | Hold Space | L-thumb middle · LT2 | Best left-thumb key |
| L3 | Mouse | Hold Tab | L-thumb outer · LT3 | |
| L4 redesigned | Symbols | Hold Bsp | R-thumb middle · LT4 | No lateral movement |
| L5 | Numbers | Hold Ent | R-thumb inner · LT5 | |
| L6 | Function Keys | Hold Del | R-thumb outer · LT6 | |
| L7 | Clipboard | Hold Z · Hold / | Pinkies · MO(7) | Symmetric — one-hand mouse use |
| L8 key moved | Brackets | Hold C · Hold , | Middle fingers down · MO(8) | Was D/H, promoted to L10 |
| L9 redesigned | Code & CLI | Hold X · Hold . | Ring fingers down · MO(9) | Shell operators, path nav TD |
| L10 redesigned | International | Hold D · Hold H | Index fingers down · MO(10) | Promoted — bilateral content |
| L11 new | Tiling WM — Quick | Hold F · Hold U | Middle fingers up · MO(11) | WS 1–4 reflex access |
| L12 new | Tiling WM — Full | Hold L | R-index top · MO(12) | WS 1–10 · numpad memory · left hand free |
Colemak-DH base with Home Row Mods via Tap Dance. Tipping terms tuned per finger: ring/pinky (A, R, I, O) 250 ms · index/middle (T, S, N, E) 200 ms.
Top row layer access (new in v1.0.0): W/Y → L1 RGB&Media · F/U → L11 Tiling WM · L → L12 Full WS Map. These use Tap Dance: tap = letter, hold = layer.
Bottom row layer access: Z// → L7 (Clipboard) · X/. → L9 (Code & CLI) · C/, → L8 (Brackets) · D/H → L10 (International). Middle finger down one row (C/,) was chosen over index finger lateral stretch to G/M — vertical movement is shorter, more natural, and keeps the hand anchored.
Esc is a plain key (no layer hold) — the thumb cluster is fully free for layer use on L1.
Redesigned in v1.0.0. Activated by holding W (left ring, top row) or Y (right ring, top row). The key advantage over the previous Esc-based access: all six thumb keys remain available while the layer is held, which is essential since both thumb clusters carry layer functions here.
Left half — RGB control: Home row A→T: Spd+/Sat+/Hue+/Val+. Bottom row Z→D: Spd−/Sat−/Hue−/Val−. Left thumbs: Mode− / RGB Toggle / Mode+.
Right half — Media control: Home row N→O: Prev/Vol−/Vol+/Next. Bottom row: Bri−/Bri+ (screen brightness). Right thumbs: Mute / Play / Stop.
Arrow keys on NEIO (right home row) — the consistent directional pattern used across all Cadenza navigation layers. Clipboard operations on the top right row (Undo/Cut/Copy/Paste/Redo). Modifiers on the left half for use in combination with navigation.
NEIO = ←↓↑→ is the spatial convention throughout Cadenza: once learned, it transfers automatically to L11/L12 (focus switching and window movement).
Mouse movement on right home row (NEIO = ←↓↑→, same directional convention as navigation). Scroll wheel on right bottom row. Modifiers on left for shift-click, ctrl-click etc. Clipboard on right top row.
Completely redesigned in v1.0.0 using a Frequency + Strength principle: symbols are ranked by daily usage frequency (in German IT prose + code), then assigned to fingers in strength order.
Home row: T (index, strongest) = = rank 1 · S (middle) = ! rank 3 · R (ring) = _ rank 2 · A (pinky) = # rank 4. Right home: N=$ E=@ I=% O=&. Secondary symbols on bottom row.
Tab thumb = − (KC_MINUS): deliberate exception — the hyphen is very frequent in German compound words and has no direct L0 key on a 36-key layout. Placing it on the Symbols thumb avoids a second layer change mid-word.
Access key decision: Hold Bsp (right thumb middle) — this position requires no lateral thumb movement, making it ergonomically superior to Ent or Del. Since Symbols is the second-most-used layer, it earns the best right-thumb position.
Numpad layout on left hand. This spatial arrangement is deliberately reused by L12 Tiling WM Full Map for workspace numbers — the same finger positions for 1–9 and 0 mean workspace navigation requires no new muscle memory.
F1–F12 on left hand in numpad arrangement (same shape as L5 Numbers). F12/11/10 on top/home/bottom for the outer positions, F7–F9 / F4–F6 / F1–F3 for the inner columns. PrtSc/ScrLk/Pause on the rightmost column.
Fully symmetric: activated by holding Z (left pinky) or / (right pinky). This symmetry is deliberate — clipboard operations frequently happen one-handed while the other hand is on the mouse. Holding / with the right pinky frees the entire left hand for Undo/Cut/Copy/Paste.
Tap = opening bracket · Hold = closing bracket. All four bracket types on the four strongest home-row fingers. Both halves have identical content, so brackets are reachable regardless of which hand holds the layer key.
Access key upgrade (v1.0.0): Previously on D/H (index fingers). Promoted D/H to the higher-priority L10 International layer. Brackets moved to C/, (middle fingers down) — middle finger straight down one row is still excellent ergonomics.
Dedicated shell and code operator layer. Left home row carries shell operators in a deliberately chosen order (not frequency order): A=|| · R=2>&1 · S=&& · T= | .
Path navigation key (right home N, TD3): The central innovation of L9. Tap=/ · Hold=~/ · Double=../. Three related filesystem tokens on one key — an entire path can be typed without releasing the layer.
Right home: TD11=$()/${} (cursor placed inside automatically) · TD31=!=/== · TD32==>/->. Bottom H=$? (last exit code).
Completely redesigned in v1.0.0 — both halves now have content, and the layer is accessible from both index fingers (D or H).
Left side (hold H → left hand free): A=− hyphen · R=€ (RALT+5) · S=ß (RALT+S) · T=TD33 (" dead key on tap, " literal on hold).
Right side (hold D → right hand free): N=TD33 (same as T — " dead key accessible from either hand) · E=TD4 (` tap, ``` double) · I=| · O=\ · H='.
Key insight: The " dead key (for ä, ö, ü) sits on both T (left) and N (right) via TD33 — the most important German character input is reachable regardless of which hand holds the layer. ß and € use direct RALT keycodes rather than macros, saving two macro slots.
New in v1.0.0. Quick access to workspaces 1–4 for i3/Sway (or any $mod+N WM). Designed for reflex speed on the four most-used workspaces.
Finger strength ordering: T (strongest index) = WS1 · A (weakest pinky) = WS4. The most-used workspace earns the best finger, consistent with the Frequency+Strength principle applied to symbols.
Home row right: Focus switching (⊞+←↓↑→) using the NEIO directional convention. Bottom row right: Move window within workspace (⊞⇧+←↓↑→). Thumbs (both sides, symmetric): Kill / Float toggle / Fullscreen — WM actions are available regardless of which hand holds the layer key.
New in v1.0.0. Full workspace map for WS 1–10. Access via Hold L (right index, top row) — this frees the entire left hand for workspace selection.
Numpad muscle memory: The workspace positions exactly mirror L5 Numbers — WS1=X, WS2=C, WS3=D (bottom) · WS4=R, WS5=S, WS6=T (home) · WS7=W, WS8=F, WS9=P (top) · WS10=Spc (the 0 thumb position). No new spatial memory required.
Tap/Hold via Tap Dance (TD34–TD43): Tap = go to workspace (⊞+N) · Hold = move window to workspace (⊞⇧+N). Right side and thumbs are identical to L11 for consistent muscle memory across both WM layers.
TD budget: 10 new TDs (TD34–43) for WS1–10. Total after v1.0.0: 43/48 used · 5 slots free (TD15, TD44–47).
43 of 48 slots used. Free: TD(15), TD(44)–TD(47). Tipping terms: 200 ms for index/middle fingers · 250 ms for ring/pinky fingers.
| # | Tap | Hold | Double | Term (ms) | Notes |
|---|---|---|---|---|---|
| TD(0) | z | MO(L7) | — | 200 | Z + Clipboard layer (left pinky) |
| TD(1) | / | MO(L7) | — | 200 | / + Clipboard layer (right pinky) |
| TD(2) | x | MO(L9) | — | 200 | X + Code & CLI layer (left ring) |
| TD(3) | / | ~/ (M1) | ../ (M6) | 200 | Path navigation — L9 right home N (index) |
| TD(4) | ` (KC_GRAVE) | ` literal (M2) | ``` (M3) | 200 | Backtick / code fence — L10 right home E. KC_GRAVE on tap allows grave-accent combining; M2 on hold gives literal backtick |
| TD(5) | ( | ) | ) | 200 | Paren pair — L8 |
| TD(6) | [ | ] | ] | 200 | Square bracket pair — L8 |
| TD(7) | < | > | > | 200 | Angle bracket pair — L8 |
| TD(8) | { | } | } | 200 | Curly brace pair — L8 |
| TD(9) | c | MO(L8) | — | 200 | C + Brackets layer (left middle) |
| TD(10) | , | MO(L8) | — | 200 | , + Brackets layer (right middle) |
| TD(11) | $() + ← (M8) | ${} + ← (M9) | — | 200 | Shell expansion — L9 right home E. Cursor placed inside automatically |
| TD(12) | . | MO(L9) | — | 200 | . + Code & CLI layer (right ring) |
| TD(13) | f | MO(L11) | — | 200 | F + Tiling WM Quick layer (left middle top) |
| TD(14) | u | MO(L11) | — | 200 | U + Tiling WM Quick layer (right middle top) |
| TD(15) | — | — | — | — | Free slot |
| TD(16) | h | MO(L10) | — | 200 | H + International layer (right index) |
| TD(17) | d | MO(L10) | — | 200 | D + International layer (left index) |
| TD(18) | g | App/Menu | — | 200 | G / App-Menu — inner column, only non-layer use |
| TD(19) | m | App/Menu | — | 200 | M / App-Menu — inner column, only non-layer use |
| TD(20) | t | Shift | — | 200 | T / Shift — HRM left index (strongest) |
| TD(21) | s | Ctrl | — | 200 | S / Ctrl — HRM left middle |
| TD(22) | r | Alt | — | 250 | R / Alt — HRM left ring (250 ms) |
| TD(23) | a | Meta | — | 250 | A / Meta — HRM left pinky (250 ms) |
| TD(24) | n | Shift | — | 200 | N / Shift — HRM right index (strongest) |
| TD(25) | e | Ctrl | — | 200 | E / Ctrl — HRM right middle |
| TD(26) | i | AltGr | — | 250 | I / AltGr — HRM right ring (250 ms) |
| TD(27) | o | Meta | — | 250 | O / Meta — HRM right pinky (250 ms) |
| TD(28) | w | MO(L1) | — | 200 | W + RGB & Media layer (left ring top) |
| TD(29) | y | MO(L1) | — | 200 | Y + RGB & Media layer (right ring top) |
| TD(30) | l | MO(L12) | — | 200 | L + Tiling WM Full layer (right index top) |
| TD(31) | != (M12) | == (M13) | — | 200 | Not-equal / equal — L9 right home I |
| TD(32) | => (M14) | -> (M15) | — | 200 | Fat arrow / thin arrow — L9 right home O |
| TD(33) | " dead (LSFT+QUOTE) | " literal (M4) | — | 200 | German umlaut dead key / literal quote — L10 T and N. Tap triggers combining dead key (ä, ö, ü); hold gives literal " without combining |
| TD(34–43) | LGUI(0–9) | SGUI(0–9) | — | 200 | Workspace 1–10: tap = go to WS · hold = move window to WS. TD34=WS1 … TD43=WS10. Used on L12 left hand (numpad positions) |
All 16 macro slots used in v1.0.0.
| ID | Type | Output | Usage |
|---|---|---|---|
| M0 | Text | $? | Last exit code — L9 bottom H |
| M1 | Text | ~/ | Home directory — TD(3) hold on L9 N |
| M2 | Tap seq | ` | Backtick dead-key bypass (GRAVE + Space) — TD(4) hold on L10 E |
| M3 | Tap seq | ``` | Markdown code fence — TD(4) double on L10 E |
| M4 | Tap seq | " literal | Quote dead-key bypass (LSFT(QUOTE) + Space) — TD(33) hold on L10 T and N |
| M5 | Text | | | Pipe with spaces — L9 home T (right index) |
| M6 | Text | ../ | Parent directory — TD(3) double on L9 N |
| M7 | Tap seq | 2>&1 | Stderr redirect — L9 home R (left ring) |
| M8 | Tap seq | $() + ← | Command substitution — TD(11) tap on L9 E. Cursor placed inside |
| M9 | Tap seq | ${} + ← | Variable expansion — TD(11) hold on L9 E. Cursor placed inside |
| M10 | Text | && | And-chain — L9 home S (left middle) |
| M11 | Text | || | Or-chain — L9 home A (left pinky) |
| M12 | Text | != | Not-equal — TD(31) tap on L9 I |
| M13 | Text | == | Equality — TD(31) hold on L9 I |
| M14 | Text | => | Fat arrow — TD(32) tap on L9 O |
| M15 | Text | -> | Thin arrow / pointer — TD(32) hold on L9 O |
Note: ß and € do not use macros in v1.0.0 — they are programmed as direct RALT keycodes (RALT(KC_S) and RALT(KC_5)), saving two macro slots compared to the original design.
Cadenza-Corne-Pro-2026_04_25-v17.vil.uf2 drag-and-drop (double-tap reset → RPI-RP2 drive appears)5010774632021243529#define TAP_DANCE_ENTRIES 48 in config.h (default is 32)36 keys. Zero revenue. Infinite tap dances.
Cadenza v1.0.0 · Designed by one7two99 · MIT · github.com/one7two99/cadenza