Skip to content

Steno-related changes to the open-source QMK firmware

License

GPL-2.0, GPL-2.0 licenses found

Licenses found

GPL-2.0
LICENSE
GPL-2.0
license_GPLv2.md
Notifications You must be signed in to change notification settings

openstenoproject/qmk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QMK Steno Firmware

This repository is a fork of the QMK firmware containing changes specific to hobbyist steno keyboards that are not currently merged into upstream QMK:

  • Support for protocols like Plover HID
  • New keyboards, such as Ecosteno
  • Optional behavior changes such as first-up chord send and chord repeat

See the QMK firmware repository and documentation for more information on QMK itself.

Keyboards Supported

Keyboard Source Binaries
Georgi gboards/georgi
Splitography splitography
The Uni (v2) the_uni/pro_micro StenoKeyboards
The Uni (v3) the_uni/usb_c StenoKeyboards
Ecosteno noll/ecosteno Nolltronics
Multisteno noll/multisteno Nolltronics

Steno Protocols

Serial (TX Bolt, Gemini PR)

The industry-standard TX Bolt and Gemini PR steno protocols are included in upstream QMK, and QMK's steno docs go into more detail on how to set that up, but in summary:

Add the following definitions to your keymap's rules.mk file:

VIRTSER_ENABLE = yes
STENO_ENABLE = yes

And use the constants with the STN_ prefix to specify what steno key each key on your board should send. For example, the base layer for the Uni looks as follows:

/* keymap.c */
#include "keymap_steno.h"

LAYOUT(
  STN_S1,  STN_TL,  STN_PL,  STN_HL,  STN_ST1,  STN_ST3,  STN_FR,  STN_PR,  STN_LR,  STN_TR,  STN_DR ,
  STN_S2,  STN_KL,  STN_WL,  STN_RL,  STN_ST2,  STN_ST4,  STN_RR,  STN_BR,  STN_GR,  STN_SR,  STN_ZR ,
                    STN_N1,  STN_A,   STN_O,    STN_E,    STN_U,   STN_N2,
),

Plover HID

The Plover HID protocol is an in-development protocol that relies on the standard HID protocol rather than USB serial, resulting in more customizability and a better user experience.

To use Plover HID, add the following definitions to your keymap's rules.mk:

STENO_ENABLE = no
PLOVER_HID_ENABLE = yes

The keycodes for Plover HID are the same as the TX Bolt constants for serial, but use the PLV_ prefix instead of STN_:

/* keymap.c */
#include "keymap_plover_hid.h"

LAYOUT(
  PLV_SL,  PLV_TL,  PLV_PL,  PLV_HL,  PLV_STR,  PLV_STR,  PLV_FR,  PLV_PR,  PLV_LR,  PLV_TR,  PLV_DR ,
  PLV_SL,  PLV_KL,  PLV_WL,  PLV_RL,  PLV_STR,  PLV_STR,  PLV_RR,  PLV_BR,  PLV_GR,  PLV_SR,  PLV_ZR ,
                    PLV_NUM, PLV_A,   PLV_O,    PLV_E,    PLV_U,   PLV_NUM,
),

Optional Features

Josh Grams has implemented some steno extensions to the QMK firmware, allowing for easier repetition of certain chords or outlines. These features can be enabled by defining constants in your keymap's config.h.

First-Up Send (STENO_1UP)

/* config.h */
#define STENO_1UP

This feature sends a stroke when you release the first key, allowing you to hold down common keys across several strokes. For example, you can fingerspell by holding down the common chord on the right-hand side, and tapping the letters on the left-hand side:

↓ -FPLT
↓ O  ↑ O       → /OFPLT
↓ S  ↑ S       → /S-FPLT
↓ P  ↑ P-FPLT  → /P-FPLT

Auto-Repeat (STENO_REPEAT)

/* config.h */
#define STENO_REPEAT

/* Maximum number of strokes in an outline to repeat */
#define MAX_REPEAT 8
/* Window of time within which a stroke is considered a repeat */
#define STENO_REPEAT_DELAY_MS 350
/* Percent multiplier for the speed of sending repeated strokes */
#define STENO_REPEAT_SPEED_PERCENT 400

This feature lets you double-tap a stroke to repeat it 4 times as fast as your double-tap (currently capped at 50 strokes per second):

↓ STPH  ↑ STPH  ↓ STPH   → /STPH/STPH/STPH/...
↑ STPH

You can also repeat sequences up to 8 strokes long. Write the full outline, then press and hold the first stroke again, for example:

↓ SUD   ↑ SUD   → /SUD
↓ -PB   ↑ PB    → /SUD/-PB
↓ HREU  ↑ HREU  → /SUD/-PB/HREU
↓ SUD           → /SUD/-PB/HREU/SUD/-PB/HREU/SUD/-PB/HREU/...
↑ SUD