Skip to content

Speedy Entry

Speedy Entry is Write's assisted-editing mode. When it's on, the editor "interprets" some of the characters you type and turns them into full neumaRk syntax, reducing the number of keystrokes needed to write notes, chords, durations and accidentals.

Speedy Entry does not change the grammar of the language: it always produces valid neumaRk source. It's just a writing shortcut. It can be turned off at any time from the Settings → Speedy Entry dialog.

The shortcuts are per row: the behaviour depends on the type of musical row the cursor is in (C), N), A), D), L)). Each shortcut is governed by an independent flag you can turn on or off in the settings.

General shortcuts

Active in any musical row.

Tab → close the measure

Pressing Tab on a musical row inserts a barline |:

C) C7 D7|Tab   →   C) C7 D7 |

If there's already a space before the cursor, only | is added.

P → raise by a semitone

P chromatically shifts the event under the cursor by +1 semitone. It works both in chord rows and note rows:

N) c4|P    →   N) d♭4
C) Cm7|P   →   C) C#m7

L → lower by a semitone

Symmetrically, L shifts by −1 semitone. In chord rows the sequences 7alt, DCal…, D$al… are allowed, and in those cases L stays literal.

@|al@ expansion

Typing @| (or @ before an existing barline) expands to al@, producing the end-of-section decorators al@ / DCal@ / D$al@:

… D$@|     →   … D$al@|
… DC@|     →   … DCal@|
… @|       →   … al@|     (at line start or after a space)

Alternatively, in a note row, @ preceded by a space + Tab expands directly into al@| (barline and separator included):

N) c4 @Tab    →   N) c4 al@|

Z + ↑ / Z + ↓ → chromatic shift ±1

Z works as a custom modifier key (as if it were an extra Alt). With Z held, raises and lowers by a semitone. Functional equivalent of P / L.

Pressed on its own, Z still inserts z as a normal character. The Z + key combos only act when the cursor is in a note or chord row, outside the barline area and annotations.

Z + L / Z + P → literal l / p

L and P on their own are chromatic-shift triggers. With Z held they stay literal characters, needed to write annotations like al@, slide, legato, pizz, palm-mute, etc.

N) c4 a Z+L   →   N) c4 al
N) c4 Z+P     →   N) c4 p

Chord row (C) and C+)

The shortcuts below apply both to the main chord row C) and to the alternative-chord row C+, which shares the same grammar.

Speedy Entry inactive inside labels: if the cursor is inside a chord comment-label ([label] or "label", where you write free text), Speedy Entry doesn't intervene — the characters stay literal.

Auto-uppercase of the root

A chord root typed lowercase is automatically capitalised:

C) c7       →   C) C7
C) C/g      →   C) C/G       (also after a slash bass)

P% on an empty measure

When the cursor is inside a measure still empty of chords (e.g. right after a barline), P inserts % (the measure-repeat symbol). If the measure already contains any token (even a marker like :open| or a style name), P stays literal and doesn't trigger the substitution.

Z + S → sharp (#)

A dedicated combo to insert a # without ambiguity (a literal s is reserved for the sus suffix).

Z + F → flat ()

Inserts the unicode symbol , which is then normalised to b.

Z + E → enharmonic change

Changes the enharmonic alias of the chord under the cursor: C#D♭, F#7G♭7, etc. It keeps the same actual pitch.

+ / → chromatic shift ±1

+ and chromatically shift the chord under the cursor by a semitone. It also works on the alternative bass of a slash chord:

C) C|+     →   C) C#
C) C#|+    →   C) D            (repeatable)
C) C7|+    →   C) C#7          (suffix preserved)
C) C/G|+   →   C) C/G#         (slash bass altered)
C) Cm7|+   →   C) C#m7

To insert literal + / (needed for the chord suffixes C+, 5+, M+, +M, +M7, +7, and for the alterations 7+5, 7+9, 7+11) you use the escape Z + + / Z + −:

C) C|     + Z+`+` + 7   →   C) C+7         (= C7#5)
C) C7|    + Z+`+` + 5   →   C) C7+5
C) CM|    + Z+`+`       →   C) CM+         (= CΔ#5)
C) C|     + Z+`-`       →   C) C-          (= Cm, alternative form)

Tip: instead of + for augmented, you can also write aug or #5 (all equivalent forms after the parser's normalisation). For minor you can write m (e.g. Cm7 instead of C-7).

+ / don't always trigger

If there's no chord event under the cursor, + and stay literal. In particular the volta marker [1.]+4 needs no escape:

C) C7 | [1.]|+4 D7   →   C) C7 | [1.]+4 D7

Auto-space between chords

When the cursor is "stuck" to a previous chord, typing a new uppercase root [A-G] automatically adds a space:

C) C7G7         →   C) C7 G7
C) CM7#5A7      →   C) CM7#5 A7
C) Cm7D7        →   C) Cm7 D7

The space is not added in these cases (the user is continuing the same unit):

C) C7 G7        →   C) C7 G7      (there's already a space)
C) C/G          →   C) C/G        (slash bass)
C) (D F)        →   C) (D F)      (optional group)
C) [1.]+4 D7    →   C) [1.]+4 D7  (volta decorator)

For lowercase letters, auto-uppercase + auto-space behave asymmetrically, because some letters are part of legitimate chord suffixes (see next section).

"Safe" vs "ambiguous" lowercase letters

Some lowercase letters are part of lowercase chord suffixes (aug, alt, dim, b5, b9, etc.); others aren't. Speedy Entry distinguishes:

Lowercase letter on the chord under the cursor Behaviour
c, e, f, g (safe) upper-case + auto-space
a (aug, alt) literal
b (accidental, b5/b6/b9/b13) literal
d (dim) literal

The Caug exception: the final g of aug is a "safe" letter but closes a suffix, it isn't a new root. Speedy Entry looks at the two preceding characters: if they are au, the g stays literal.

Examples of fluent writing:

C) c7g7         →   C) C7 G7         (c → C, g → G + space)
C) c7f7         →   C) C7 F7         (c → C, f → F + space)
C) Caug         →   C) Caug          (a/u literal, g preceded by `au` → literal)
C) C7alt        →   C) C7alt         (a literal)
C) Cm7b9        →   C) Cm7b9         (b literal)
C) Cdim7        →   C) Cdim7         (d literal)

To get G7 A7 (with A as an ambiguous letter), type uppercase directly: G7A7G7 A7. The auto-space always triggers on the uppercase [A-G], whatever the letter.

Note row (N))

Key auto-correction

The notes you enter are auto-altered according to the current key (standard order of sharps F♯-C♯-G♯-D♯-A♯-E♯-B♯; symmetrically for flats):

HK) D                    (key of D major: 2 sharps)
N) f       →   N) f#
N) c       →   N) c#

Synthetic durations

Key Becomes
6 16 (sixteenth)
3 32 (thirty-second) or 2. (dotted half) — choose which in the settings
k ^ (tie)
N) c|6     →   N) c16
N) c4|k    →   N) c4^

Apostrophe / comma → octave ±1

N) c4|'    →   N) c'4       (octave up)
N) c4|,    →   N) c,4       (octave down)

On an "empty" event (apostrophe/comma/tie only), a new apostrophe or comma creates a new separate event.

Z + S / Z + F / Z + B / Z + E

Same shortcuts as the chord row:

  • Z + S#
  • Z + F
  • Z + B (alternative with B instead of F)
  • Z + E → enharmonic change

Auto-space between notes

Automatically inserts a space between successive events when the cursor is about to produce a new event stuck to the previous one:

N) c4|d        →   N) c4 d
N) c4|<        →   N) c4 <           (opening a chord-stack)
N) [f#|e       →   N) [f# e          (inside a grace group)
N) <c|e        →   N) <c e           (inside an open chord-stack)

The space is not added if the previous character is already a space or a tie ^, or when opening the chord-stack (< + note → no space before the first inner pitch).

Note annotations "..."

Inside an annotation block (delimited by double quotes) all the characters you type are literal, including spaces: the parser recognises the quoted content as a single token, so no automatic substitution is needed.

N) c4"a slow lyric"|       (spaces inside the quotes stay as such)

Auto-lowercase of pitches

In a note row, pitches are written lowercase. If you type an uppercase letter (C, D, ...), it can be automatically converted to lowercase with the autoLowerCase flag. Off by default — useful if you're used to writing uppercase in the note row too.

+ / → chromatic shift ±1

As in the chord row, + and shift the event under the cursor (note, chord-stack, grace group) by ±1 semitone:

N) c4|+        →   N) c#4
N) c#4|+       →   N) d4              (repeatable)
N) <c e g>4|+  →   N) <c# e# g#>4     (the whole chord-stack)
N) <c|e g>4    + → N) <c# e g>4       (only the note under the cursor)

In a note row + and never have a syntactic meaning, so they're always intercepted as shift triggers. Exceptions:

  • After @ (absolute-octave syntax c@-1_4) the stays literal
  • Inside an annotation "...", + / are free text
  • With Cmd / Ctrl / Alt held, the system shortcut (e.g. page zoom) takes precedence

Articulations row (A))

Automatically inserts a space before each articulation token, except when the new character completes a 2-character combo (-!, >!, os, ol, tr):

A) -|>       →   A) - >
A) >|!       →   A) >!         (accent-marcato combo)
A) o|l       →   A) ol         (long ligature)
A) t|r       →   A) tr         (trill)

Dynamics row (D))

Auto-space is limited to the . character (placeholder); the other dynamics letters form multi-character tokens (mp, mf, sf, sfz, p<, f>, …) and are not spaced.

Lyrics row (L))

Pressing - (hyphenation dash) prepends a space if there isn't one already, so that each continuation syllable is a separate token aligned under the next note:

L) Ma|-ri    →   L) Ma -ri

Summary

Key / Combo Row Effect
Tab any musical inserts a barline
P notes / chords shift +1 semitone
L notes / chords shift −1 semitone
@\| any al@ expansion (also <sp>@+Tab on notes)
Z + ↑ / Z + ↓ notes / chords shift ±1 semitone
Z + L / Z + P notes / chords inserts literal l / p
c…g lowercase notes note (with key auto-correction)
C…G uppercase chords chord root
P chords (empty row) inserts %
Z + S notes / chords #
Z + F notes / chords
Z + B notes
Z + E notes / chords enharmonic change
+ / on an event notes / chords chromatic shift ±1
Z + + / Z + − notes / chords inserts literal + /
6 notes 16 (sixteenth)
3 notes 32 or 2.
k notes ^ (tie)
' / , notes octave +1 / −1
auto-space notes / chords / art. / dyn. / lyr. separates successive events
auto-uppercase / lowercase chords / notes normalises the case of roots / pitches

Learn more

  • Full syntax of the neumaRk language (notes and durations, chords with the exhaustive list of suffixes, rhythm, decorators, voltas, etc.): documentation and specification on neumark.dev.
  • All Speedy Entry settings: the Settings → Speedy Entry dialog inside the Write app.