╔═══════════════════════╗ ║ ║ ║ S O N A T A ║ ║ ║ ║ 28 keys. ║ ║ Form fully ║ ║ realized. ║ ╚═══════════════════════╝
Sonata (n.): a complete musical form in three or four movements — the synthesis of theme, development, and resolution.
Sonata is a 28-key split keyboard layout that synthesizes Cadenza (36-key) and Coda (22-key). It keeps Cadenza's full HRM and complete alphabet on base, takes Coda's zero lateral stretch, and adds what neither could: a dedicated Backspace, bilateral Meta solved cleanly. v3.0 reorganizes the layer-trigger system (combos eliminated, four bilateral pairs added), rebuilds L_SYM by symbol frequency, and configures every access key + Home Row Mod as Tap Dance for per-key timing control.
Tab→Overflow, Spc→Nav, Bsp→Num, Ent→Sym (single thumbs); W+P→Fn, U+F→CLI, C+B→WM, V+K→Mouse (bilateral letter pairs). Bilateral pairs are easier to hit than precise-timed combos and use letters with low enough frequency for safe hold detection.MO()/LT()/MT(). Enables per-key tapping-term tuning — useful especially for pinky positions (typically 250 ms) vs index (180–200 ms).= on Spc thumb (strongest position), _ on Tab thumb. ~ and ^ added (were missing). Removed L_CLI overlap: |, `, ``` stay only on L_CLI. Duplicate ! eliminated." on both index_home for bilateral umlaut access. ä/Ä, ö/Ö, ü/Ü on vowel positions as Tap Dance (tap = lowercase, hold = uppercase via S(RALT(KC_X))).0 on L_NUM Tab thumb, WS10 on L_WM Tab thumb — both "10th" elements get the same thumb position; the 1–9 grid stays clean on the left hand on both layers.MB1=Ent, MB2=Bsp, MB3=Tab (left+right click + middle click on thumbs, accessible regardless of which hand holds V/K).L0 Base, L1 Overflow, L2 Sym, L3 Num, L4 Nav, L5 Mouse, L6 Fn, L7 CLI, L8 WM. Layer count corrected: 9 (Base + 8 modal), not 10 as the original spec misstated.| to · to avoid pipe-character confusion.A R S T / N E I O); all 16 off-home letters reshuffled to minimize SFB. SFB drops from 1.79% to ~1.27% — closing the gap to Miryoku (1.28%). The R_ring V·I·U disaster (0.45% column SFB in v1.1) is gone; new R_ring is P·I·B at ~0.05%.Three constraints that no off-the-shelf 28-key layout meets together: (a) zero lateral index/inner-column stretch, (b) full bilateral HRM with cross-hand Meta+Alt, (c) German+English+code mixed bigram optimization on a layer system tuned for shell and tiling WM. v2.0 is the version where the SFB cost of meeting all three drops to within statistical noise of Miryoku on 36 keys; v3.0 keeps that alpha placement and rebuilds the layer-access architecture around bilateral letter pairs and Tap Dance for per-key timing.
Sonata is the third in a family. Cadenza (36) is the daily driver. Coda (22) is the minimalist concept. Sonata sits between, asking: can a 28-key board offer the structural cleanliness of Coda (zero lateral stretch, no inner column) with the linguistic completeness of Cadenza (full alphabet on base, full HRM)?
The answer through v1.x was: yes structurally, but at a measurable SFB cost vs Miryoku-on-36. v1.0 oversold this. v1.1 corrected the marketing (1.79% honest SFB, "sibling, not successor"). v2.0 closes most of the SFB gap through a full alpha redesign that keeps the Colemak-DH home row but optimally reassigns every off-home letter.
The v2.0 process explicitly considered an alternative home row (the "C2" I↔O swap) and rejected it after full layout placement showed C1 dominates. It also explicitly considered a more aggressive variant (C1-bestV: U on L_pinky_bot, ~0.97% SFB) and chose the safer C1-balance for the released v2.0 — leaving bestV available as a v2.1 if the residual SU/US SFB on L_mid proves uncomfortable in daily use.
4 finger columns × 3 rows × 2 sides + 2 thumb keys × 2 sides = 28 keys. No inner column. Column-stagger geometry. Custom 28-key PCB target. Below is the base layer — the same structural shape is reused on every layer that follows.
| Principle | Rationale |
|---|---|
| Zero lateral stretch | No inner column. The lateral reach in Colemak-DH/Miryoku that hits the index inner-column key (B/N) is eliminated by removing the column entirely. |
| Bilateral HRM, all 8 home keys | Modifier-on-tap, letter-on-press. Both pinkies map to Meta (LGUI / RGUI) so Meta+Alt resolves cross-hand without HRM same-hand conflict. |
| 4 utility thumbs | Each thumb is a Tap Dance: tap = key, hold = layer. Tab/Overflow, Spc/Nav, Bsp/Num, Ent/Sym. Backspace and Enter are dedicated thumb keys, not combos. |
| 9-layer architecture | Base + 8 modal layers (Overflow, Sym, Num, Nav, Mouse, Fn, CLI, WM). Layer access via 4 thumb singles (Tab/Spc/Bsp/Ent) and 4 bilateral letter pairs (W+P for Fn, U+F for CLI, C+B for WM, V+K for Mouse). All access keys are Tap Dance for per-key timing control. |
| QMK keymap.c (not Vial) | Unlimited tap-dances and macros, per-layer combos, full programmability. ~43 tap-dances + 16 macros (current spec). |
| Mixed-language alpha optimization | v2.0 alpha placement minimizes SFB across English + German + code. Colemak-DH home row preserved; column-mates redesigned from scratch. |
| Position-weighted ergonomic accounting | Pinky-top × 2.0, home × 1.0, bot × 1.2. Reflects that pinky-top is the only genuinely hard pinky position; pinky-home and pinky-bot are fine. |
The Colemak-DH home row is preserved unchanged. All 16 off-home letters were reassigned to minimize SFB while honoring three structural constraints: D cannot share a column with N (ND ~1.5% German), H cannot share a column with E (HE ~3% English), C cannot share a column with S (SC ~0.30%). U was the trickiest: it cannot go on R_pinky (recreates v1.1's IU disaster) or R_mid (EU is German same-finger). U landed on L_mid_bot — paying ~0.30% SU/US SFB as the cheapest U-on-left option.
| Position | v1.1 | v2.0 | Reasoning |
|---|---|---|---|
| L_pinky_top | Z | Z | unchanged — rarest left letter on hardest pinky position |
| L_pinky_bot | G | V | G's 2.5% wasted on pinky-bot; V (0.9%) cheaper |
| L_ring_top | W | W | unchanged |
| L_ring_bot | M | C | C displaced from L_mid (was 0.30% SC SFB); RC ~0.15% is cheapest C-anywhere |
| L_mid_top | F | G | F leaves; G fits with rare S-bigrams |
| L_mid_bot | C | U | U on left side; SU/US ~0.30% the major new column SFB |
| L_idx_top | B | M | M is rare with T; B leaves the column |
| L_idx_bot | D | D | unchanged — D wants a strong-finger bot, TD ~0.10% is the cheapest D-anywhere on left |
| R_idx_top | L | L | unchanged — L cannot go on R_mid (EL 0.4%) or R_pinky (IL 0.3%) |
| R_idx_bot | H | H | unchanged — H must avoid R_mid (HE 3%); cross-hand TH from L_idx is structural win |
| R_mid_top | Y | Y | unchanged — also part of WM bilateral trigger |
| R_mid_bot | K | F | F pairs with E cheaper than K does; K moves to R_pinky_bot |
| R_ring_top | V | P | P with I-home is essentially zero SFB |
| R_ring_bot | U | B | B with I-home is essentially zero SFB; U leaves the I-column entirely (the v1.1 disaster) |
| R_pinky_top | J | J | unchanged — rarest letter on hardest pinky position |
| R_pinky_bot | P | K | K is rare with O-home; OK essentially never appears |
The total SFB number alone hides which columns actually carry the cost. Here's the honest column-by-column breakdown for v2.0 (alpha grid unchanged in v3.0, so SFB metrics carry over):
| Column | Letters | Main pairs | v2.0 SFB | v1.1 SFB | Δ |
|---|---|---|---|---|---|
| L_pinky | Z·A·V | AV/VA | ~0.08% | 0.07% | +0.01 |
| L_ring | W·R·C | RC/CR | ~0.20% | 0.20% | 0 |
| L_mid | G·S·U | SU/US | ~0.35% | 0.35% (was SC) | 0 |
| L_idx | M·T·D | TD/DT | ~0.08% | 0.22% | −0.14 |
| R_idx | L·N·H | (all rare) | ~0.08% | 0.05% | +0.03 |
| R_mid | Y·E·F | YE/EY · FE/EF | ~0.38% | 0.25% | +0.13 |
| R_ring | P·I·B | (all rare with I) | ~0.05% | 0.45% (V·I·U) | −0.40 |
| R_pinky | J·O·K | (all rare) | ~0.05% | 0.20% | −0.15 |
| Total | ~1.27% | 1.79% | −0.52 |
The two remaining hotspots are L_mid (G·S·U) at ~0.35% — driven by SU/US, the cost of placing U on the left side without using the pinky — and R_mid (Y·E·F) at ~0.38% — the structural cost of E being so reactive that any non-trivial column-mate creates moderate SFBs. The R_ring fix (V·I·U → P·I·B) is the single biggest win and the structural justification for the v2.0 redesign.
Sonata exposes nine layers (L0 base + eight modal layers). Every layer is rendered below as the full 28-key board. The gold-glowing key on each board is the one you press and hold to activate that layer; bilateral triggers light up both keys.
All 24 alpha letters on the 4×3 alpha grid. Home row preserves Colemak-DH (A·R·S·T / N·E·I·O); off-home letters reshuffled in v2.0 to minimize SFB. All 8 home-row keys are HRM (tap = letter, hold = mod). Thumbs carry Tab/Space/Bsp/Enter as tap with layer access on hold.
Activated by holding Tab (left outer thumb). Home-row redesign: dead-key " on both index home positions (bilateral), ß on S_left_mid, € on R_left_ring (direct AltGr keycodes). Q on E_right_mid, X on I_right_ring. Umlauts on vowel positions as Tap Dance: tap = lowercase, hold = capital (ä/Ä on A_pinky, ö/Ö on O_pinky, ü/Ü on U_mid_bot).
Frequency-based redesign. Strong positions get common symbols: = on Spc thumb (strongest), * on T (left idx home), . on N (right idx home), , on E. Bracket pairs as Tap Dance on right top (tap=open, hold=close). String quotes as TD on I (right ring home). Less common chars (~ ^ \ %) on weaker positions. No overlap with L7 Code/CLI: backtick/pipe-macros stay there.
Numpad layout on left hand: ring=1/4/7, mid=2/5/8, idx=3/6/9 — same spatial layout as the L_WM workspace grid. Right hand carries math operators on top, 0/comma/period/equals on home, and parentheses + € on bottom.
Mouse layer activated bilaterally via V (left pinky bot) or K (right pinky bot). Mouse buttons on thumbs: Tab=MB3 (middle), Bsp=MB2 (right), Enter=MB1 (left). Left home row carries pure modifiers for click-with-modifier (Shift-click etc.). Right top: scroll wheel. Right home: cursor movement. Note: Btn1/2/3 also still on right bottom — possibly redundant with thumb assignment.
Bilateral activation via W (left) or P (right) — both ring-top, low-frequency letters. F1–F9 on left in numpad positions (same spatial layout as L_NUM and L_WM — muscle memory transfers). F10–F12 on left pinky column. Media controls on right: prev/next/stop/PrtSc on top, mute/vol/play on home, brightness/eject on bottom.
Shell-tuned layer activated bilaterally via U or F (mid-bottom on both hands). Left home row: pipe and logical operators (deliberate order: T=| · S=&& · R=||). Right home: path/expansion/comparison/arrow Tap Dances (tap = short form, hold = expanded form). $? and 2>&1 on right bottom. Backtick TD on right pinky bottom for inline code and fenced blocks.
Bilateral activation via C (left) or B (right) — both ring-bottom, low-frequency enough for safe hold detection. Workspaces 1–9 on left in numpad layout (matches L_NUM spatially), WS10 on left Tab thumb (matches the 0 position on L_NUM). Float/Full on right top, PrtSc on R_pinky_top. Window focus arrows on right home, window-move arrows on right bottom. Kill window on right outer thumb.
| Metric | QWERTY/Z | Colemak-DH | Miryoku | Cadenza | Coda | Sonata v3.0 |
|---|---|---|---|---|---|---|
| Keys | 104+ | 104+ | 36 | 36 | 22 | 28 |
| SFB rate | 6.31% | 1.28% | 1.28% | ~1.20% | ~0.90% | ~1.27% |
| Home row | 34% | 68% | 68% | 68% | 64% | 63.5% |
| Pinky raw | ~14% | ~6% | ~13.4% | ~5% | 0% | 14.6% |
| Pinky weighted | ~17.5% | ~7.7% | ~14.1% | ~6.5% | 0% | 16.1% |
| Lateral stretch | Very high | Low | Low | Low | Zero | Zero |
| Inner column | Yes | Yes | Yes (5-col) | Yes | No | No |
| Backspace | Yes | Yes | Yes (thumb) | Yes (thumb) | No (combo) | Yes (thumb) |
| German EU | Same-row roll | Same-finger ✗ | Same-finger ✗ | Same-finger ✗ | Different col ✓ | Different col ✓ |
| German SCH | — | Column SFB | Column SFB | Column SFB | OK | Cross-finger ✓ |
| Meta + Alt | Both LH | Mod keys | HRM (LH conflict) | Cross-hand ✓ | Both LH ring ✗ | Cross-hand ✓ |
| Layers | 1–2 | 1–2 | 6 | 13 | 9 | 9 |
Sonata is one of four related layouts in a single family. Each shares a Colemak-DH base and Tap Dance Home Row Mods; the differences come from key count, hardware target, and how much of the layer system can survive the reduction. The musical naming describes how each variant relates to the others: Cadenza is the demanding solo passage (the origin), Cadence the same piece adapted for a smaller hardware, Sonata the complete musical form (synthesis of the family ideas), and Coda the concluding distillation.
Sonata is not a simple descendant of any single layout. v3.0 is a synthesis point — it consolidates lessons from a parallel improvement of Cadenza and the build of Cadence. The seven-step chronology:
① Cadenza v1.0 36 keys · Corne Choc · the origin
│
② Sonata v1.0 28 keys · started — first reduction attempt
│
③ Coda v0.1 22 keys · started in parallel — distillation
│
④ Sonata v2.0 alpha-grid redesign (Sonata's own SFB work)
│
⑤ Cadenza (improved) refinements to the 36-key origin
│
⑥ Cadence v1.5.0 34 keys · Ferris Sweep
│ port of the improved Cadenza
│
⑦ Sonata v3.0 ◄───────┴──── synthesis of:
· learnings from ⑤ Cadenza improvements
· learnings from ⑥ building Cadence
applied to Sonata's layer-access architecture:
· combos eliminated → bilateral letter pairs
· all access keys + HRMs as Tap Dance
· L_SYM rebuild by frequency
Coda's chronology is parallel to early Sonata work — it started as a separate "what's the absolute minimum" exploration and has stayed at concept stage (v0.1). Cadence was built specifically to bring the improved Cadenza muscle memory onto Ferris Sweep hardware — same design philosophy, two thumb keys less.
| Property | Cadenza v1.0.0 | Cadence v1.5.0 | Sonata v3.0 | Coda v0.1 |
|---|---|---|---|---|
| Keys | 36 | 34 | 28 | 22 |
| Hardware | Corne Choc · RP2040 | Ferris Sweep | (custom 28-key target) | custom 22-key PCB · concept |
| Pinky used | Yes | Yes | Yes | No |
| Inner column | Yes | Yes (G/M only — letters + App/Menu) | No | No |
| Layers | 13 | 13 active | 9 (Base + 8 modal) | 9 |
| Tap dances | 43 / 48 | 46 / 48 | ~43 | 34 |
| Macros | 16 / 16 | 16 / 32 | 16 | 16 |
| Combos | 0 | chord access (e.g. Bsp+Spc → Fn) | 0 (bilateral pairs instead) | 9 |
| SFB rate | ~1.20% | ~1.20% (inherits Cadenza) | ~1.27% | ~0.90% |
| Pinky load (raw) | ~5% | ~5% (inherits Cadenza) | 14.6% | 0% |
| Firmware tooling | Vial / QMK | Vial / QMK | QMK keymap.c | QMK keymap.c only |
| Status | Stable · daily driver | Active | Active · v3.0 release | Concept · v0.1 |
Cadence's SFB and pinky load not stated explicitly in its own documentation; values shown inherit from Cadenza by self-description ("same design philosophy, same muscle memory, two thumb keys less"). Cadenza/Coda metrics are taken from Sonata's own comparison table where the originals don't provide a direct number.
| Constant | Notes |
|---|---|
| Colemak-DH base | All four layouts use the Colemak-DH home row (A·R·S·T / N·E·I·O). Sonata and Coda redesign the off-home letters; Cadenza/Cadence keep the standard Colemak-DH alpha placement. |
| Tap Dance HRM | All four use Home Row Mods configured as Tap Dance (tap = letter, hold = modifier). Sonata v3.0 makes this explicit per-key for tapping-term tuning. |
| Layer access via hold | Layer entry is always tap-vs-hold on a base-layer key — never a separate modifier key. Thumbs carry the highest-frequency layer triggers everywhere. |
| Code & CLI layer | Every member ships a dedicated layer for shell/code work: pipe and logical operators on left home, path/expansion/comparison/arrow tap dances on right home. |
| Tiling WM layer | Workspaces 1–9 in a numpad spatial layout on the left hand, plus window-focus/move arrows on the right. WS10 placement varies by layout. |
| International layer | Direct AltGr keycodes for ä/ö/ü/ß/€ — the dead-key dance is documented but not the primary path. Sonata v3.0 adds tap=lowercase / hold=uppercase Tap Dance for umlauts. |
| NEIO arrow convention | One directional convention across Navigation, WM-focus, and WM-window layers (per Cadenza's design principles). Inherited by Sonata and Coda. |
"A tap dance for the typing elite." Three-zero-letter design: 36 keys, full pinky usage, full inner column for letters only (no layer content). 13 layers including dual WM layers, RGB controls, full firmware-control layer. 43/48 tap dances and 16/16 macros — the most fully-featured of the family. Available as an off-the-shelf Corne Choc Pro build.
"Cadenza without compromise — minus two thumbs." 34 keys on the Ferris Sweep. Same Cadenza muscle memory; the two missing thumbs cascade into three structural decisions: Esc moves to D-position, Del to right thumb inner, F-Keys via a Bsp+Spc chord. Removes redundancies: no RGB controller (Sweep has none), the two near-identical WM layers merged into one. Adds a firmware-control layer accessed via a 500 ms pinky-top hold.
"Form fully realized." 28 keys: keeps the pinky (unlike Coda) but drops the inner column entirely (unlike Cadenza/Cadence). v3.0 eliminates all combos in favor of bilateral letter pairs (W+P/Fn, U+F/CLI, C+B/WM, V+K/Mouse). All 12 access keys plus 8 HRMs configured as Tap Dance for per-key timing tuning. The alpha grid is a v2.0 redesign optimized for SFB across English + German + code.
"The distilled form of Cadenza." 22 keys: no pinky, no inner column. The 6 letters that won't fit on the 20-key alpha grid (P V Y / J X Q) live on an Overflow layer. Lowest SFB of the family at ~0.90% — partly because the 20-key grid forces optimal placement. 9 layers, 34 tap dances, 9 combos (including layer-specific). Custom PCB only — concept stage at v0.1.
| If you… | Choose |
|---|---|
| Want an off-the-shelf board today (Corne Choc Pro available) | Cadenza v1.0.0 |
| Already own a Ferris Sweep and want the Cadenza muscle memory on it | Cadence v1.5.0 |
| Are willing to commission a custom 28-key PCB and want the redesigned SFB-optimized alpha grid + bilateral layer access | Sonata v3.0 |
| Want the absolute minimum (no pinky, no inner column) and accept the concept-stage status + custom hardware | Coda v0.1 |
v1.0 oversold this. v1.1 corrected to "sibling, not successor" with v1.1's 1.79% SFB trailing Miryoku's 1.28%. v2.0 closed most of the SFB gap — 1.27% (estimated) vs Miryoku's 1.28%, essentially tied within estimation noise. v3.0 inherits this alpha placement unchanged and adds layer-system improvements on top. The remaining differences are structural, not optimization gaps.
Verdict: Sonata v3.0 is a credible sibling on the same Pareto frontier; it no longer trails on SFB. The remaining gaps (~2 pp pinky, ~4.5 pp home row) are intrinsic to the 28-key constraint. Pinky comfort + proven design → Miryoku on a Sweep. Lowest lateral stretch + German EU/SCH fidelity + cross-hand Meta+Alt + dedicated Backspace → Sonata v3.0.
Both v2.0 and v3.0 use the conservative C1-balance; the more aggressive C1-bestV (see process notes in sonata-spec.json under v2_0_proposals_explored). The bestV variant trades:
| Current (C1-balance, v2.0–v3.0) | bestV candidate (future variant) | |
|---|---|---|
| U position | L_mid_bot (paired with S) | L_pinky_bot (paired with A) |
| L_mid column SFB | ~0.35% (SU/US) | ~0.05% (FSG essentially zero) |
| L_pinky column SFB | ~0.08% (AV/VA) | ~0.12% (AU/UA) |
| Total SFB | ~1.27% | ~0.97% |
| Weighted pinky | 16.1% | 19.2% |
bestV candidate layout (future variant): ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │ Z │ W │ F │ M │ │ L │ K │ P │ J │ ├───┼───┼───┼───┤ ├───┼───┼───┼───┤ │ A │ R │ S │ T │ │ N │ E │ I │ O │ ├───┼───┼───┼───┤ ├───┼───┼───┼───┤ │ U │ C │ G │ D │ │ H │ Y │ B │ V │ └───┴───┴───┴───┘ └───┴───┴───┴───┘
The decision rule for migrating: if after 3–4 weeks of daily use the residual SU/US SFB on L_mid genuinely interferes with typing flow, the bestV reshuffle is a small surgical change (six keys move) and the SFB win is meaningful. If the SU/US never bothers you, the current placement is the better long-term home because U-on-pinky is the riskier ergonomic bet.
#define TAP_DANCE_ENTRIES 34 #define TAPPING_TERM 200 #define PERMISSIVE_HOLD #define HOLD_ON_OTHER_KEY_PRESS #define COMBO_TERM 40 #define COMBO_ONLY_FROM_LAYER
enum sonata_layers {
L_BASE = 0,
L_OVF, // Tab-hold (single)
L_SYM, // Ent-hold (single)
L_NUM, // Bsp-hold (single)
L_NAV, // Spc-hold (single)
L_MOUSE, // V-hold OR K-hold (bilateral)
L_FN, // W-hold OR P-hold (bilateral)
L_CLI, // U-hold OR F-hold (bilateral)
L_WM // C-hold OR B-hold (bilateral)
};
| Group | Count | Notes |
|---|---|---|
| Layer access (thumbs) | 4 | Tab/Overflow, Ent/Sym, Bsp/Num, Spc/Nav · term 200ms |
| Layer access (bilateral letters) | 8 | W+P (Fn), U+F (CLI), C+B (WM), V+K (Mouse) · term 200ms |
| Home row mods | 8 | A R S T N E I O · idx/mid term 200ms; ring/pinky term 250ms |
| Bracket pairs (on L_SYM) | 5 | (·), [·], {·}, <·>, "·' |
| Code actions (on L_CLI) | 5 | TD_PATH (/·~/), TD_EXP ($()·${}), TD_CMP (!=·==), TD_ARR (=>·->), TD_BTK (`·```) |
| Umlauts (on L_OVF) | 3 | ä/Ä on A_pinky, ö/Ö on O_pinky, ü/Ü on U_mid_bot |
| Workspaces (on L_WM) | 10 | Win+1..10 with Shift on hold |
| Total | 43 |
US International. Umlauts via "+a/o/u (deadkey method); ß via RAlt+S; € via RAlt+5. Literal " via M9 macro (sends "+Space) to bypass the deadkey when needed.
MIT License · 2026 · one7two99 · github.com/one7two99/sonata
Based on Colemak-DH by stevep99 — home row preserved, column-mates redesigned in v2.0; layer-access architecture redesigned in v3.0.
Family: Cadenza (36) · Sonata (28) · Coda (22)