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. You turn it on and off with a click on the Speedy Entry button in the toolbar; long-pressing it opens the settings window.

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 window, which is split by row type (General, Chords, Notes, Articulations, Dynamics, Lyrics). Unless stated otherwise, they are all on by default.

General shortcuts

Tab works in any musical row; the other shortcuts in this section work in note and chord rows.

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) c#4
C) C-7|P   →   C) C#-7

If the cursor isn't touching any event, P stays an ordinary letter.

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@|

! → measure repeat %!

In a measure that contains only a repeat %, %2 or %4, a ! typed in contact with it is moved to its canonical position; a second ! removes it:

N) !%      →   N) %!
N) %2!     →   N) %!2
N) %! + !  →   N) %          (pressed again: removed)

In a note row, outside this case, ! does something else: see Forced accidental.

Z as a modifier

In note and chord rows Z works as a modifier key (as if it were an extra Alt): held down, it changes the meaning of the key you press with it. Some combinations transform the touched event or insert a symbol (Z + ↑/↓, Z + S, Z + F, Z + B, Z + E), others let you type a character literally that Speedy Entry would otherwise intercept (Z + L, Z + P, Z + +, Z + −).

In these rows, pressing and releasing Z on its own types nothing. It types an ordinary z in the other rows, in the barline area and inside free text (an annotation "…" or a label).

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

With Z held, ↑ raises and ↓ lowers the touched event by a semitone. Functional equivalent of P / L.

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)

m → - (minor)

Minor is preferably written with the dash. Typing m right after the root (or after its accidental) gives -:

C) Cm      →   C) C-
C) C#m7    →   C) C#-7
C) Dbm     →   C) Db-

The m stays as it is when it doesn't follow the root: for example in dim. The parser also accepts Cm7: if you want the m in the text, turn off the m → minor dash flag in the settings, or write the chord with Speedy Entry off.

p → % on an empty measure

When the cursor is inside a measure still empty of chords (e.g. right after a barline), the p key (lowercase) 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. With Shift (uppercase P) you always get the letter.

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#7 ↔ G♭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) C-7|+   →   C) C#-7

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)

Tip: instead of + for augmented, you can also write aug or #5 (all equivalent forms after the parser's normalisation). For minor just type m after the root: it becomes - (see above).

+ / − 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) C-7D7        →   C) C-7 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) C-7b9        →   C) C-7b9         (b literal)
C) Cdim7        →   C) Cdim7         (d literal)

To get G7 A7 (with A as an ambiguous letter), type uppercase directly: G7A7 → G7 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 2. (dotted half, default) or 32 (thirty-second) — choose which in the settings
k ^ (tie)
N) c|6     →   N) c16
N) c4|k    →   N) c4^

With 3 → 2., typing a 2 right afterwards still gives 32.

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.

Forced accidental

On a note touched by the cursor, ! forces the accidental: the ! is put in the right place in the token, after the pitch and any accidental and before octave and duration. Pressed again, it removes it:

N) c4|!     →   N) c!4
N) c#4|!    →   N) c#!4
N) c#!4|!   →   N) c#4

On rests, spacers and grace notes the ! stays as typed. For the ! in contact with % see measure repeat.

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

Same shortcuts as the chord row, plus Z + B:

  • Z + S → #
  • Z + F → ♭
  • Z + B → ♭ (alternative with B instead of F, note row only)
  • 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. It applies to notes, rests r and spacers s:

N) c4|d        →   N) c4 d
N) c4|r        →   N) c4 r
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).

Tab inside a grace group

With the cursor inside a grace group […], right after a note, Tab doesn't insert a barline: it completes the acciaccatura by adding the missing /^ modifiers and, if the group is still open, the ]. The cursor ends up after the ], ready for the main note:

N) [a|Tab       →   N) [a/^]
N) [a4 b|Tab    →   N) [a4 b/^]

p → % on an empty measure

As in the chord row, the p key (lowercase) inserts % in a note measure that is still empty, as long as it follows a space:

N) c4 d e f | p    →   N) c4 d e f | %

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# f 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 on a touched event they're always intercepted as shift triggers. Exceptions:

  • If the cursor isn't touching any event (between two events, in an empty measure, at the end of the row) the character stays literal
  • 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 combo (_!, >!, os, ol, tr, tr~, 8.) or attaches to a text ("x"-, ("x")):

A) _|>       →   A) _ >
A) _|!       →   A) _!         (portato)
A) >|!       →   A) >!         (accent + staccato)
A) o|l       →   A) ol         (long fermata)
A) t|r       →   A) tr         (trill)

Inside a text ("…" or a […] box) the auto-space doesn't intervene.

Dynamics row (D))

Auto-space triggers only when you type . (placeholder); the other dynamics letters form multi-character tokens (mp, mf, sf, sfz, p<, f>, …) and are not spaced.

Lyrics row (L))

Off by default — turn it on in the Speedy Entry settings, Lyrics section. When it's on, 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
Tab inside […] notes completes the grace with /^ and ]
P notes / chords shift +1 semitone
L notes / chords shift −1 semitone
@\| notes / chords al@ expansion (also <sp>@+Tab on notes)
! in contact with % notes / chords %! (pressed again: removes it)
! on a note notes forced accidental (c4 → c!4)
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
m after the root chords - (minor)
p (lowercase) chords / notes (empty measure) 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 2. (default) or 32
k notes ^ (tie)
' / , notes octave +1 / −1
auto-space notes / chords / art. / dyn. separates successive events
auto-space before - lyrics (L)), off by default separates the syllables
auto-uppercase / lowercase chords / notes (lowercase off by default) 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: long-press the Speedy Entry button in Write's toolbar.
  • Write's keyboard shortcuts outside Speedy Entry: see Write.