Cadence is a 34-key split keyboard layout for the Ferris Sweep, built on Colemak-DH and configured in Vial. It is the Sweep adaptation of the Cadenza layout (36-key Corne Choc) — same design philosophy, same muscle memory, two thumb keys less.
Cadenza without compromise — minus two thumbs.
" dead-key path is unchanged. Firmware now requires TAP_DANCE_ENTRIES = 64.v1.9.0 reorganizes Cadence's layer system to mirror Sonata v3.0 wherever physically possible. The intent: future migration to Sonata hardware becomes a "learn the new alpha grid" exercise rather than a complete relearning of the layer architecture. Layers L1–L9 now match Sonata's numbering; L10 (Clipboard) and L11 (Firmware Control) are Cadence-only extras.
| v1.8.0 layer | v1.9.0 layer | Change |
|---|---|---|
| L1 Media | merged into L6 | Combined with F-Keys into single Fn+Media layer |
| L2 Navigation | L4 Navigation | Renumbered (Sonata position) |
| L3 Mouse | L5 Mouse | Renumbered |
| L4 Symbols | L2 Symbols | Renumbered |
| L5 Numbers | L3 Numbers | Renumbered |
| L6 F-Keys | merged into L6 | Combined with Media; chord trigger eliminated |
| L7 Clipboard | L10 Clipboard | Renumbered to "Cadence extra" range; trigger removed |
| L8 Brackets | L9 Brackets | Renumbered to "Cadence extra" range |
| L9 Code & CLI | L7 Code & CLI | Renumbered (Sonata position) |
| L10 International | L1 Overflow + International | Renumbered + renamed |
| L11 Workspaces | L8 Tiling WM | Renumbered + renamed |
| L12 Firmware Control | L11 Firmware Control | Renumbered to "Cadence extra" range |
Access keys reassigned by usage frequency × ergonomic strength × hold-detection safety. The Bsp+Spc chord trigger (formerly for F-Keys) is eliminated since L6 Fn+Media now has direct bilateral access via C+,. All access keys remain configured as Tap Dance for per-key tapping-term control.
| Layer | v1.8 access | v1.9 access |
|---|---|---|
| L1 Overflow + Intl | D + H bilateral (was L10) | Hold Spc (single thumb) |
| L2 Symbols | Hold Bsp (was L4) | Hold Bsp (unchanged) |
| L3 Numbers | Hold Ent (was L5) | Hold Ent (unchanged) |
| L4 Navigation | Hold Spc (was L2) | Hold Tab |
| L5 Mouse | Hold Tab (was L3) | F + U (Middle Top) |
| L6 Fn + Media | L1: W+Y · L6: Bsp+Spc chord | C + , (Middle Bottom) |
| L7 Code & CLI | X + . (was L9) | W + Y (Ring Top) |
| L8 Tiling WM | F + U (was L11) | Z + / (Pinky Bottom) |
| L9 Brackets | C + , (was L8) | D + H (Index Bottom) |
| L10 Clipboard | Z + / (was L7) | no trigger (unreachable) |
| L11 Firmware | Q + ' long-hold (was L12) | Q + ' long-hold (unchanged) |
HOLD_ON_OTHER_KEY_PRESS.The Ferris Sweep has 34 keys (30 alpha + 4 thumb) versus the Corne Choc's 36 (30 alpha + 6 thumb). The two missing thumb keys force three structural decisions:
| Cadenza (36) | Cadence (34) | Rationale |
|---|---|---|
| Esc on left thumb outer | Esc on D-position (L2/L3 bottom row) | Index-finger-down during Hold-Space — reachable without leaving home |
| Del on right thumb outer | Del on right thumb inner (L2 / L6) | Reassigned within the layers that need it |
| L6 F-Keys via Hold Del | L6 F-Keys via Bsp + Spc chord | Hold Bsp → L4 active → Hold Spc-position → MO(6) → L6 |
| L1 RGB & Media | L1 Media only | Sweep has no RGB — feature dropped |
| L11 (WS Quick) + L12 (WS Full) | L11 Workspaces (consolidated) | Single unified WM layer, F/U → L11 |
| (no firmware control layer) | L12 Firmware Control | Bootloader + reboot, accessible only via long pinky-top hold (500 ms) — deliberately uncomfortable |
| L10 with " dead-key only | L10 with direct ä/ö/ü TDs + " fallback | Mnemonic A/U/O placement, hold = capital. Faster than dead-key for daily writing. |
Cadence (via Cadenza) keeps Miryoku's core insight (layers via thumb holds, HRM on home row) and replaces the parts that don't serve the specific use case.
| Feature | Miryoku | Cadence v1.9.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 |
| Bracket access | Scattered across layers | L8: tap=open, hold=close, both halves, symmetric |
| Code & CLI layer | Not standard | L9: shell operators, path TD, expansion macros, pipe TD |
| German / International | No support | L10: bilateral access · direct ä/ü/ö TDs on A/U/O · " dead key fallback · ß/€ via RAlt |
| Tiling WM integration | None | L11 Workspaces (WS 1–10, focus, window-move, Kill/Float/Fullscreen) |
| Firmware control | None | L12: bootloader + reboot, safety-gated 500 ms hold |
| Layer access keys | Thumb-only | Thumbs + top row + bottom row — priority by frequency × ergonomics |
| Inner column rule | G/M used for layer content | G/M never used for layer content |
| L6 access on a 34-key board | Would lose a layer | Bsp + Spc chord activation |
The inner column (G/M in Colemak-DH) requires a lateral inward index movement. G and M carry only their base letters plus App/Menu on hold. Never layer content. This rule holds without exception through v1.9.0.
Every layer access key requires straight vertical finger movement. Pinky down (Z//) → L7. Ring down (X/.) → L9. Middle down (C/,) → L8. Index down (D/H) → L10. Middle up (F/U) → L11. Ring up (W/Y) → L1.
Index > Middle > Ring > Pinky. = (rank 1 symbol) sits on T. $ (rank 5) sits on N. AltGr and Meta on weaker fingers.
The N-E-I-O home row positions carry ←/↓/↑/→ on L2 Navigation. The same pattern repeats on L11 Workspaces and L2 word-skip. Once learned, the spatial pattern transfers automatically.
Cadence enforces this rule strictly. The single exception: L12 Firmware Control on Q and ', with a 500 ms hold. The uncomfortable position plus the long hold serves as a deliberate safety mechanism for functions that must never accidentally trigger.
The most-frequently-used layers earn the best key positions. Symbols (L4) → right thumb middle (Bsp). International (L10) → strongest index pair (D/H). F-Keys (L6, rare) → chord. Firmware Control (L12, very rare) → worst position with longest hold.
v1.9.0 reorganizes layer numbering and access keys for compatibility with Sonata v3.0. The first 9 modal layers (L1–L9) match Sonata's layer order, simplifying any future migration to Sonata hardware.
| Layer | Name | Access | Position | Notes |
|---|---|---|---|---|
| L0 | Base | — | Always active | Colemak-DH + Tap Dance HRM |
| L1 | Overflow + International | Hold Spc | L thumb outer | ä Ä ö Ö ü Ü as TD · " dead key · ß · € |
| L2 | Symbols | Hold Bsp | R thumb outer | = and - on thumbs · brackets as TD on right top |
| L3 | Numbers | Hold Ent | R thumb inner | Numpad on left · 0 on Spc · - on Tab |
| L4 | Navigation | Hold Tab | L thumb inner | Arrows on right home · word jumps · Home/End/PgUp/PgDn |
| L5 | Mouse | Hold F · Hold U | Middle Top | Strong + safe pair · most-used non-thumb layer |
| L6 | Function Keys + Media | Hold C · Hold , | Middle Bottom | F1–F12 left, media right · merged from v1.8 L1+L6 |
| L7 | Code & CLI | Hold W · Hold Y | Ring Top | Pipe macros · path/expansion/comparison TDs |
| L8 | Tiling WM | Hold Z · Hold / | Pinky Bottom | WS 1–10 · numpad spatial memory · safest hold pair |
| L9 | Brackets | Hold D · Hold H | Index Bottom | Bilateral mirror · tap = open, hold = close · needs term tuning |
| L10 | Clipboard | — | (no trigger) | Layer present but unreachable — user opts out |
| L11 | Firmware Control | Long-hold (500 ms) Q · ' | Pinky Top | Safety-gated bootloader access |
All five bilateral letter-pair triggers in v1.9.0 are finger-symmetric: the left-hand and right-hand triggers are played by the same finger on both hands, in the same row. This makes the muscle memory uniform — the brain learns "Mouse = both middle fingers, top row" rather than memorizing two separate positions.
| Layer | Pair | Finger | Row | Letter frequency |
|---|---|---|---|---|
| L5 Mouse | F + U | Middle | Top | moderate (~2-3% each) — safe |
| L6 Fn+Media | C + , | Middle | Bottom | C ~3%, , very frequent in prose — riskier |
| L7 Code & CLI | W + Y | Ring | Top | both rare — very safe |
| L8 Tiling WM | Z + / | Pinky | Bottom | both rare — safest pair |
| L9 Brackets | D + H | Index | Bottom | ~5% each — needs tapping-term tuning |
Layer access positions in v1.9.0 follow a deliberate priority: most-used layers get the strongest+safest finger pairs, least-used get the weakest. The user's actual usage hierarchy on a Windows corporate laptop drives the assignment:
All 12 layers as configured in the Vial keymap. Each card shows the complete 34-key board with activator highlighting, access-key markings on Base, and finger-position labels at the bottom of each key.
Colemak-DH alpha grid with Tap Dance Home Row Mods on the eight home positions (A R S T / N E I O). Layer triggers are placed by frequency × ergonomic strength: thumbs for the four most-used modal layers, bilateral letter pairs for the next five, long-hold pinky-top for safety-gated firmware control. L10 Clipboard has no access key by user choice.
German letters and currency: ä Ä ö Ö ü Ü as Tap Dance (tap = lowercase, hold = capital), ß and € as direct AltGr keycodes, " and ' as Tap Dance for either-hand access. Q and X are also reachable here for Sonata-compatibility (already on Cadence Base, but mirrored here so muscle memory transfers if the user later moves to Sonata hardware).
Symbols sorted by daily usage frequency in German IT writing, then assigned to fingers in strength order. - on Spc-thumb, = on Tab-thumb (the two most-used operators on the strongest positions). * on T (left index home, strongest finger after thumbs); ! on S; + on R; \ on A. Bracket pairs as Tap Dance on right top: (·) on L, [·] on U, {·} on Y, <·> on '. Prose punctuation on right home: . on N, , on E, "·' TD on I, ; on O. Less common math/logic on bottom rows.
Numpad on the left hand: ring=1/4/7, middle=2/5/8, index=3/6/9. 0 on Spc-thumb, minus on Tab-thumb. Right hand carries math operators (+ − ×) on top, modifier mirror on home, keypad equivalents on bottom.
Arrow cluster on right home (← ↓ ↑ →). Word-jump (Ctrl+arrow) on right top. Home/PgDn/PgUp/End on right bottom. Modifier mirror on left home for Shift+arrow selection. Esc on Tab-thumb (trans on hold), Caps Lock on P-position.
Most-used non-thumb layer per the user's workflow (Windows corporate laptop, no trackpad-replacement). Bilateral activation via F or U (both Middle Top — strong finger, safe hold-detection). Cursor on right home, scroll wheel on right bottom, mouse buttons on right thumbs (Bsp=MB1, Ent=MB2). Tab-thumb=Esc; Spc-thumb=MB3 (middle click).
Merged in v1.9 from the former L1 Media + L6 F-Keys. F1–F12 on left in numpad-spatial layout (matches L_NUM and L_WM positions for muscle-memory transfer): ring=F4/F7/F1, middle=F5/F8/F2, index=F6/F9/F3; F10/F11/F12 on pinky column. Right hand carries media controls: Prev/Vol−/Vol+/Next on home, Bri−/Bri+ on bottom, Mute/Play-Stop TD on thumbs.
Shell-tuned layer activated bilaterally via W or Y (Ring Top, low-frequency letters → safe hold-detection). Left home: || on A, 2>&1 on R, && on S, pipe Tap Dance on T (tap = |, hold = | with surrounding spaces for shell readability). Left bottom: backtick ` on C, backslash \ on D. Right home as Tap Dances: path TD on N (tap = /, hold = ~/, double = ../); shell expansion TD on E (tap = $(), hold = ${}); comparison TD on I (tap = !=, hold = ==); arrow TD on O (tap = =>, hold = ->). Right bottom: $? macro on H (last command exit status), tilde ~ on comma position.
Bilateral activation via Z or / (Pinky Bottom — both letters very rare in DE+EN, safest hold-detection of all bilateral pairs). Workspaces 1–9 on left in numpad spatial layout (matches L_NUM): X/C/D = WS1/2/3, R/S/T = WS4/5/6, W/F/P = WS7/8/9. WS10 on Spc-thumb. Right hand carries window focus arrows (⌘+arrow) on home and window-move arrows (⌘⇧+arrow) on bottom.
Bilateral mirror of bracket pairs as Tap Dance (tap = open, hold or double-tap = close). Bilateral access via D or H (Index Bottom — strongest fingers; needs HOLD_ON_OTHER_KEY_PRESS + tapping-term tuning since both letters are common ~5%). Brackets are also available on L_SYM, but L_BRK provides the bilateral mirror for two-handed code entry.
Layer present in firmware but no access key assigned. Per user decision: clipboard layer is not currently in active use, so no trigger has been allocated. Layer can be reactivated at any time by adding a hold target in Vial.
Safety-gated bootloader access. Q (left pinky top) and ' (right pinky top) both act as Tap Dance with 500 ms tapping term — accidental triggering on prose typing is unlikely. Hold opens the layer where QK_BOOT (bootloader) and QK_REBOOT live on the home row.
Cadence v1.9.0 uses 50 of 64 available Tap Dance slots. The remaining slots (TD(10), TD(21), TD(52)–TD(63)) are reserved for future expansion. All values are extracted directly from the Vial configuration file.
| Group | Count | Used in |
|---|---|---|
| Home Row Mods | 10 | L0 Base |
| Layer access keys (top row) | 6 | L0 Base |
| Layer access keys (bottom row) | 8 | L0 Base |
| Action TDs (Media) | 1 | L6 Fn+Media |
| Action TDs (Symbols/Brackets) | 5 | L2 Symbols, L9 Brackets |
| Action TDs (Code & CLI) | 7 | L7 Code & CLI |
| Action TDs (Workspaces) | 10 | L8 Tiling WM |
| Action TDs (Umlaut capitals) | 3 | L1 Overflow + International |
| Total used | 50 | — |
| TD# | Tap | Hold | Double | Tap-Hold | Term | Used in |
|---|---|---|---|---|---|---|
| Home Row Mods — left hand | ||||||
TD(0) | A | ⌘ | — | — | 250 ms | L0 Base (HRM) |
TD(1) | R | ⌥ | — | — | 200 ms | L0 Base (HRM) |
TD(2) | S | ⌃ | — | — | 200 ms | L0 Base (HRM) |
TD(3) | T | ⇧ | — | — | 200 ms | L0 Base (HRM) |
TD(4) | G | ⌘ | — | — | 200 ms | L0 Base (HRM) |
| Home Row Mods — right hand | ||||||
TD(5) | M | App | — | — | 200 ms | L0 Base (HRM) |
TD(6) | N | ⇧ | — | — | 200 ms | L0 Base (HRM) |
TD(7) | E | ⌃ | — | — | 200 ms | L0 Base (HRM) |
TD(8) | I | AltGr | — | — | 200 ms | L0 Base (HRM) |
TD(9) | O | ⌘ | — | — | 250 ms | L0 Base (HRM) |
| Layer access — top row | ||||||
TD(11) | W | → L7 | — | — | 200 ms | L0 → Hold to L7 |
TD(14) | F | → L5 | — | — | 200 ms | L0 → Hold to L5 |
TD(22) | U | → L5 | — | — | 200 ms | L0 → Hold to L5 |
TD(23) | Y | → L7 | — | — | 200 ms | L0 → Hold to L7 |
TD(46) | Q | → L11 | — | — | 500 ms | L0 → Long-hold to L11 |
TD(47) | ' | → L11 | — | — | 500 ms | L0 → Long-hold to L11 |
| Layer access — bottom row | ||||||
TD(12) | Z | → L8 | — | — | 200 ms | L0 → Hold to L8 |
TD(13) | / | → L8 | — | — | 200 ms | L0 → Hold to L8 |
TD(15) | X | — | — | — | 200 ms | L0 (no hold) |
TD(16) | C | → L6 | — | — | 200 ms | L0 → Hold to L6 |
TD(17) | D | → L9 | — | — | 200 ms | L0 → Hold to L9 |
TD(18) | H | → L9 | — | — | 200 ms | L0 → Hold to L9 |
TD(19) | , | → L6 | — | — | 200 ms | L0 → Hold to L6 |
TD(20) | . | — | — | — | 200 ms | L0 (no hold) |
| Action TDs — Media (L6) | ||||||
TD(24) | MPLY | MSTP | — | — | 200 ms | L6 R thumb |
| Action TDs — Symbols / Brackets (L2 / L9) | ||||||
TD(25) | ( | ) | ) | — | 200 ms | L2 R idx top, L9 R idx home, L9 L idx home |
TD(26) | [ | ] | ] | — | 200 ms | L2 R mid top, L9 R mid home, L9 L mid home |
TD(27) | < | > | > | — | 200 ms | L2 R ring top, L9 R ring home, L9 L ring home |
TD(28) | { | } | } | — | 200 ms | L2 R pinky top, L9 R pinky home, L9 L pinky home |
TD(51) | ' | " | — | — | 200 ms | L2 I position |
| Action TDs — Code & CLI (L7) | ||||||
TD(29) | / | Macro 1 | Macro 6 | — | 200 ms | L7 R idx home |
TD(30) | Macro 8 | Macro 9 | — | — | 200 ms | L7 R mid home |
TD(31) | Macro 12 | Macro 13 | — | — | 200 ms | L7 R ring home |
TD(32) | Macro 14 | Macro 15 | — | — | 200 ms | L7 R pinky home |
TD(33) | " | Macro 4 | — | — | 200 ms | L1 T position, L1 N position |
TD(34) | ' | Macro 2 | — | Macro 3 | 200 ms | L1 D position, L1 H position |
TD(45) | | | Macro 5 | — | — | 200 ms | L7 T position |
| Action TDs — Workspaces (L8) | ||||||
TD(35) | ⌘+1 | ⌘⇧+1 | — | — | 200 ms | L8 X |
TD(36) | ⌘+2 | ⌘⇧+2 | — | — | 200 ms | L8 C |
TD(37) | ⌘+3 | ⌘⇧+3 | — | — | 200 ms | L8 D |
TD(38) | ⌘+4 | ⌘⇧+4 | — | — | 200 ms | L8 R |
TD(39) | ⌘+5 | ⌘⇧+5 | — | — | 200 ms | L8 S |
TD(40) | ⌘+6 | ⌘⇧+6 | — | — | 200 ms | L8 T |
TD(41) | ⌘+7 | ⌘⇧+7 | — | — | 200 ms | L8 W |
TD(42) | ⌘+8 | ⌘⇧+8 | — | — | 200 ms | L8 F |
TD(43) | ⌘+9 | ⌘⇧+9 | — | — | 200 ms | L8 P |
TD(44) | ⌘+0 | ⌘⇧+0 | — | — | 200 ms | L8 Spc thumb |
| Action TDs — Umlaut capitals (L1) | ||||||
TD(48) | AltGr+Q | Macro 16 | — | — | 200 ms | L1 A position |
TD(49) | AltGr+Y | Macro 17 | — | — | 200 ms | L1 U position (right ring top) |
TD(50) | AltGr+P | Macro 18 | — | — | 200 ms | L1 O position |
Cadence v1.9.0 uses 19 of 32 available macro slots. Macros are categorised by purpose: shell helpers, code operators, and German uppercase umlauts.
| Macro | Output | Action sequence | Purpose |
|---|---|---|---|
M0 | $? | Text: $? | Shell: last command exit status |
M1 | ~/ | Text: ~/ | Shell: home directory shortcut |
M5 | | | Text: | | Shell: pipe with surrounding spaces |
M6 | ../ | Text: ../ | Shell: parent directory |
M7 | 2>&1 | Text: 2>&1 | Shell: redirect stderr to stdout |
M8 | $() | Tap: $ ( ) LEFT | Shell: command substitution (cursor inside) |
M9 | ${} | Tap: $ { } LEFT | Shell: variable expansion (cursor inside) |
M10 | && | Text: && | Shell: logical AND |
M11 | || | Text: || | Shell: logical OR |
| Macro | Output | Action sequence | Purpose |
|---|---|---|---|
M12 | != | Text: != | Code: not-equal comparison |
M13 | == | Text: == | Code: equality comparison |
M14 | => | Text: => | Code: fat arrow (lambdas) |
M15 | -> | Text: -> | Code: thin arrow (function return type, pointer member) |
QMK keycode S(RALT(KC_X)) is supported, but Vial UI represents these via macros for clarity. The action sequence below uses explicit Shift+AltGr down/up to ensure consistent behaviour across operating systems.
| Macro | Output | Action sequence | Purpose |
|---|---|---|---|
M16 | Ä | Hold down: ⇧ AltGr → Tap: Q → Release: AltGr ⇧ | Capital ä via Shift+AltGr+Q |
M17 | Ü | Hold down: ⇧ AltGr → Tap: Y → Release: AltGr ⇧ | Capital ü via Shift+AltGr+Y |
M18 | Ö | Hold down: ⇧ AltGr → Tap: P → Release: AltGr ⇧ | Capital ö via Shift+AltGr+P |
On dead-key keyboard layouts (US-International, German with dead keys), pressing apostrophe or quote alone produces no output until the next keystroke. These macros explicitly type the apostrophe + space to commit the character.
| Macro | Output | Action sequence | Purpose |
|---|---|---|---|
M2 | ' | Tap: ' Spc | Apostrophe + space (macro for dead-key avoidance) |
M3 | ' ' ' | Tap: ' Spc ' Spc ' Spc | Three apostrophe-spaces (markdown italic dance) |
M4 | " | Tap: " Spc | Double quote + space (macro for dead-key avoidance) |
Cadence v1.9.0 uses 50/64 Tap Dance slots. The standard Vial-Sweep firmware build ships with 48 entries — a custom build with TAP_DANCE_ENTRIES = 64 is required for v1.8 because TD(50) is now occupied.
Set in keyboards/ferris/sweep/keymaps/vial/config.h:
#define TAP_DANCE_ENTRIES 64
The Vial settings section in v1.9.0 contains tuned QMK settings (unchanged from v1.5.0–v1.8.0). The values are stored as numeric Vial setting IDs that depend on the specific firmware build. Documenting the semantic mapping is on the v2.0 ROADMAP.
Set the OS keyboard layout to US International. Required for:
RAlt+S → ßRAlt+5 → €RAlt+Q/Y/P → ä/ü/ö (and Shift+RAlt+Q/Y/P → Ä/Ü/Ö, used by L10 hold-macros M16/M17/M18)" dead key (Shift+Quote) → ä/ö/ü when followed by a vowelOpen Vial → File → Load saved layout → select configuration/Cadence-FerrisSweep_v1_8_0.vil.
If the keyboard becomes unresponsive: enter the bootloader by holding Q for 500 ms (left half) or ' for 500 ms (right half), then press the S-position (QK_BOOT). The half will appear as a USB drive; drop the .uf2 firmware file onto it.