Skip to content

Notes and Durations

This document defines the syntax and semantics of musical notes in neumaRk: pitches, accidentals, durations, prolongations, and implicit deduction mechanisms.

The goal is to provide a deterministic specification that is nonetheless compatible with rapid writing in informal mode.


1. Note event

A note event is the atomic musical unit in the N) line of neumaRk.

Each note event represents a single musical occurrence in time and contributes to building the rhythmic and melodic sequence of the piece.

A note event may specify, in explicit or implicit form:

  • a pitch;
  • a duration;
  • duration modifiers;
  • octave modifiers;
  • annotations;
  • ties.

Some of these elements may be omitted, provided they can be deduced deterministically from the persistent musical context, according to the rules defined in this document.

Continuity of deduction

The deduction of pitches and durations in neumaRk is based on the last explicit value encountered across the entire document, and is not limited to a single note line or a single datapack.

At the start of a new musical datapack, the reference for deducing pitches and durations is the last note event of the previous datapack, if present.

In the absence of any prior reference (for example at the start of the piece), deduction uses the default values defined by the specification, or fails in cases where deterministic deduction is not possible.


1.1 Syntactic structure of the note event

A note event consists of an ordered sequence of adjacent elements, with no intervening spaces.

The order of the elements is fixed and must be the following:

  1. Tie to the preceding note (^), optional
  2. Pitch, optional because deducible
  3. Forced accidental (!), optional
    (allowed only if the pitch is explicitly indicated)
  4. Octave modifiers, optional
    (relative octaves via ' or ,, or absolute octave)
  5. Duration, optional
  6. explicit duration (power-of-2 number, with optional dots or multipliers);
  7. tuplet indicators;
  8. or ? for unknown duration
  9. Annotations, optional, between double quotes
  10. Tie to the following note (^), optional

All elements composing a note event must be adjacent. The presence of a space separates distinct note events.

Groups in parentheses (…). Beyond explicit duration as a list (r(…), suffix) and clef change ((@…), prefix), a note event may carry additional (…) groups that specify its notehead or an ornamental glissando. Their meaning is determined by content and position: see the single rule in §11. At most per note: one clef (prefix), one glissando-in (prefix), one notehead (suffix), one glissando-out (suffix).

A note event may omit one or more elements according to the deduction rules defined in this document, but the relative order of the elements may never be altered.


Note events consisting of a single symbol

A note event consisting exclusively of a single symbol is allowed, without explicit indication of pitch or duration, provided a valid prior musical context exists.

The following symbols may by themselves constitute a valid note event:

  • Octave modifiers (' or ,)
  • Tie (^)

In such cases, the note event:

  • inherits the pitch from the preceding note event;
  • inherits the duration from the preceding note event;
  • applies exclusively the semantics of the indicated symbol.

In particular:

  • an event consisting of ' or , modifies the octave of the inherited pitch;
  • an event consisting of ^ prolongs the preceding note by the same value.

A note event consisting of a single symbol is valid only if pitch and duration can be deduced deterministically from the context. In the absence of such context (for example at the start of the piece), the event is invalid.


2. Pitch

2.1 Basic syntax

A pitch is expressed as:

<note>[accidental][octave]

Where:

  • note{a b c d e f g}
  • accidental{#, b} (optional, also double)
  • octave change (optional, see the next paragraph)

Examples:

c   d#   fb   g##

2.2 Relative octaves

The octave is computed based on the pitch of the preceding note, considering the smallest interval from it.

Examples:

f4 bb f c

The character ' immediately after the note's pitch shifts its octave upward. The character , immediately after the note's pitch shifts its octave downward.

Examples:

f4 bb, f' c'

Multiple consecutive signs are permitted for octave change.

Examples:

a,4 g''' a,,,

At the start of the piece (or at the start of a staff, in a multi-staff datapack) the orientation pitch is the note marked by the starting clef: clefs in G use a g reference, clefs in F an f reference, clefs in C a c reference.

In detail, for the clefs provided by neumaRk:

Clef Notation Reference
treble (@G) g4
treble 8va alta (@G8va) g5
treble 8va bassa (@G8vb) g3
soprano (@C1) c4
mezzo-soprano (@C2) c4
alto (@C3) c4
tenor (@C4) c4
baritone (C variant) (@C5) c4
baritone (F variant) (@F3) f3
bass (@F) or (@F4) f3
bass 8va bassa (@F8) or (@F8vb) f2

Only the clef declared at the start (of the piece or of the staff) determines the orientation reference. Any subsequent clef change (see §9) modifies the graphical clef and the visual rendering of the notes, but does not alter the reference used for computing relative octaves.


2.3 Absolute octaves

It is nonetheless possible to assert the absolute octave of a note by adding the character @ followed by the octave number (4 for middle C) and the character _. The numbering is scientific: C-1 is MIDI 0, C9 is MIDI 120; the practical useful range is roughly -1..9.

Examples:

c@4_8. g@3_2

The duration is mandatory when using @<n>_: the _ acts as a separator between the octave number and the duration value, and is meaningless without a value following it. A spelling such as c@4_ (without duration) produces error E008.

'/, remain allowed as a "nudge" on top of the absolute octave — c@4_' is equivalent to C5, c@4_,8 is equivalent to C3 as an eighth note. They are discouraged because redundant: use directly c@5_ / c@3_8.

After a note with an absolute octave, the inference for subsequent events restarts from that note as the standard last_pitch (smallest interval via DIATONIC_MATRIX, as in §2.2).

Absolute octave in chord-stack <…>

Inside a chord-stack, the absolute octave is allowed only on the first pitch, in the form:

<a@4_ c>4

Mandatory constraints:

  1. the _ that closes @<n>_ on the first pitch is mandatory (it is the separator required by the notation);
  2. the duration of the chord after > is mandatory (e.g. >4). The duration lives outside the braces and refers to the whole chord; omitting it falls into the same error E008 as the monophonic case, because internally the token is reformulated as a@4_4 (first pitch + duration) and that _ remains without a numeric value following it.

The subsequent pitches of the chord-stack (the "extras") currently accept only relative notation: their octave is inferred by smallest interval starting from the primary pitch (see §2.2). A spelling such as <a@4_ c@5_>4 is not supported; see the backlog for a future extension to the extras.


2.4 Implicit pitch

If a note does not specify a pitch, it inherits the last pitch encountered during parsing; if no pitch has yet been seen, the initial orientation reference defined in §2.2 is used (g4 for treble clef, f3 for bass clef, c4 for C clefs, etc.).

Example:

f4 8 8 g 4 8

2.5 Forced accidentals

The character ! immediately after the pitch forces the display of the accidental, even if it would be implicitly deducible from the key.

Example:

f#!8

This indicates that the accidental # must be displayed graphically.

2.5.1 Propagation of accidentals within the measure

An accidental, once shown, propagates according to the standard convention until the end of the measure. The rule is modeled by a matrix [letter][octave] that stores the active inflection for each pair letter+octave; the matrix is initialized from the key at the start of every measure (and every staff).

  • A note shows its own accidental symbol only if its inflection differs from the current value in the matrix for that letter+octave (or if forced with !, §2.5); otherwise no symbol. When the symbol is shown, the matrix is updated.
  • Propagation is per-octave: an accidental on c (octave 4) does not affect c of another octave (c5). Each letter+octave pair is independent.
  • Chord-stack (§2.6): each pitch of the stack is evaluated individually against the matrix.
  • Voice 2 (N2): has a propagation matrix independent of voice 1.
  • Grace notes (preceding the main): are evaluated against the matrix but do not update it; if a grace deviates from the matrix, it breaks propagation for that letter+octave → subsequent mains in the same measure show an explicit accidental even if they coincide with the matrix (so the reader is not misled by the inflection introduced by the grace). See neumaRk_grace_notes.md §8.

2.6 Stacked chords (chord-stack) <…>

Multiple pitches sounded together are written between angle brackets as a single event: <p1 p2 …> followed by a duration.

N) <c e g>4 .          C major held for two quarter notes
N) <f c'> f            dyad + f on top

Internal syntax. The pitches inside <…> are separated by spaces; each uses the note syntax (letter + accidental + '/, for octaves). The octaves are inferred in a cascade: the first pitch from the preceding note outside the stack, each subsequent one from the previous one inside the stack (smallest interval, §2.2). The absolute octave is allowed only on the first pitch (§2.3).

Duration. Lives outside the angle brackets, after > (<c e g>4), and applies to the entire chord. If omitted, the event inherits the duration from the context like a normal note (<c e g> .).

A single event. The chord-stack counts as one event in the count-based alignment with the A)/D)/L) lines.

Tie ^. Applies to the entire event; in rendering it ties the corresponding keys by index (<c e>4^ <c e>4 → two ties).

Primary anchoring (normative rule). The event following the stack infers pitch and octave from the first pitch of the stack, not from the last. Internally the stack maintains the cascade; toward the outside only the primary counts.

N) <c e g>^ <c e g>     two identical chords (without the rule the 2nd would rise an octave)
N) <f c'> f             the 2nd f stays at the octave of the first f of the triad
N) <f bb, d> f          Bb triad with f on top; following f = first of the stack

Errors and limits.

  • empty <> or unclosed <…E001 (malformed token).
  • Stack attached to the following note without a space (<c e g>e4) → E001; remedy: add the space.
  • r (rest) and s (spacer, §14) are not valid inside a stack; currently they are silently ignored (candidate for a future diagnostic).

The > that closes a stack belongs to the token: it is never a barline nor an anacrusis (§7), even when followed by a pitch (<c e g> e4). Likewise the | internal to a polychord [top|bottom] is the separator of the polychord, not a barline (neumaRk_chords.md §7.2).


3. Duration

3.1 Explicit duration

The duration may be indicated immediately after the pitch:

c4   d8   e16

The allowed values are the standard ones of musical notation (units with denominator based on powers of 2): 1 => whole note 2 => half note 4 => quarter note 8 => eighth note 16 => sixteenth note 32 => thirty-second note


3.2 Tuplets

A duration may be followed by the letter t indicating a tuplet value. If there are no other completing characters, it will be understood as a tuplet with ratio 3:2 (triplet). If the letter t is followed by n:n the tuplet will be based on that ratio (e.g. 5:3, 7:8). The second part of the ratio may be omitted in the most frequent cases: t4 is equivalent to t4:3 t5 is equivalent to t5:4 t7 is equivalent to t7:4

3.2.1 Inheritance of the ratio within the group

A note without a tuplet marker that follows a tuplet note, while the group is still open (it has not reached a complete cycle of the ratio), inherits the ratio of the current group (t_num:t_den). Only the first note of the group must carry the marker; the subsequent ones inherit it until closure.

N) c8t d e | …      # d, e inherit the 3:2 triplet opened by c8t

3.2.2 Incomplete tuplet at the end of the measure

If at the end of the measure a tuplet remains open (the sum of its units does not reach a complete cycle of the ratio), autofill completes it with rests of the same tuplet unit (the same base_dur as the last note of the group), until the group closes or the measure is full.

  • If closure succeeds, no diagnostic (this is the typical case of the round-trip of a complete triplet whose final rest had been omitted).
  • If autofill cannot close the group, W002 is emitted («Tuplet not closed before measure end; auto-filled with 1/64 rests»).

3.3 Implicit duration

If a note does not specify a duration, the following rules apply, in order of priority:

  1. if it is the only note of the measure, it occupies the entire duration of the measure;
  2. the last explicit duration encountered in the musical context is used;
  3. if it is at the start of the piece and no prior reference exists, the duration is considered unknown (?).

The rule of the single note occupying the entire measure has higher priority than all other forms of deduction, including those based on the persistent musical context.

3.3.1 Reconciliation with the measure duration (normative algorithm)

Once a duration (explicit or inherited) has been assigned to each event, the sum of the measure may not coincide with the time-signature duration. Reconciliation follows a deterministic algorithm. Each event is first classified:

  • explicit — duration written in the event. In an anacrusis (§7) with more than one note, all events are treated as explicit (the anacrusis does not fill the measure, so it is not redistributed);
  • unknown — duration ? (§3.4);
  • implicit — duration inherited from the context. Only the trailing implicits (the sequence of implicits after the last explicit) participate in redistribution.

Invariant: explicit durations are never modified by reconciliation. Only the trailing implicits, the ?s, are touched, or a final rest is added.

Case A — no ? (all durations known). Let S be the sum of the measure and M the time-signature duration:

  1. S ≈ M (within tolerance) → the measure is valid, no action.
  2. S > M (excess):
  3. if trailing implicits exist and the recomputed duration (M − S + sum_of_trailing_implicits) / number_of_trailing_implicits falls on a representable rhythmic value (power of 2 with 0 to 3 dots) → silent redistribution over those implicits. Typical idiom: c2 d e in 4/4 → d/e inherit the half note (total 1½ whole notes), are compressed to quarter notes;
  4. otherwise it is a real excess → error E005 (duration beyond the time signature), measure marked invalid, truncation of the final notes until the measure fits, plus a possible final filling rest. Covers both the purely explicit excess (4 4 4 4 4 in 4/4) and the non-representable implicit excess.
  5. S < M (deficit):
  6. if a tuplet has remained open, it is first completed (§3.2.2);
  7. then the residual duration is filled with a final rest. This is standard NRK autofill: no diagnostic (the old W001 has been retired).

Case B — mixed (? together with known durations). The residual duration M − S is distributed equally among only the ? events (see §3.4); no final rest is added (the ?s absorb the residual).


3.4 Unknown duration (?)

By indicating ? as the duration, the value is considered indeterminate.

The value missing to complete the measure is distributed equally among all notes with duration ?.

Example:

c? d? e?

in a 4/4 measure will identify a triplet of half notes.


4. Duration prolongations

N.B.

The meaning of the dot (.) is specific to the context of note lines and does not coincide with the one used in chord lines. The dot character takes on different meanings depending on its position adjacent to or spaced from the note event.

4.1 Adjacent dot

A dot immediately adjacent to the value prolongs the duration by half of the preceding value, as in standard notation:

g4.

4.2 Spaced dot

A dot separated by a space prolongs the duration by the same value, and may be repeated:

g8 . .
g8 ..

will identify a duration of three eighth notes.

Only the space after the note matters, not the one between the dots: both forms are equivalent.


4.3 Multipliers

An explicit multiplier may be indicated as:

g16*5
g16x5

will identify a duration equal to 5/16. Both forms are equivalent.


5. Repetition (!)

The exclamation mark (spaced from the note event) repeats the same note and the same duration:

g8 !!!

Is equivalent to:

g8 g8 g8 g8

It is possible to combine . and !.


6. Tie (^)

The symbol ^ indicates a tie.

  • if adjacent to a note event, immediately after it, it ties with the following note
  • if adjacent to a note event, preceding it, it ties with the preceding note
  • if isolated, it is equivalent to a dot (.)
  • if it is the only sign in the measure, it ties with a note that fills the measure

Accidentals across the tie. A note tied to the preceding one follows two regimes with respect to propagation (§2.5.1):

  • natural continuation — same spelling (e.g. eb ^eb): no accidental symbol (the graphical tie expresses the continuation), but the note still seeds the matrix, so that subsequent notes with the same letter+octave but a different inflection show the explicit accidental;
  • enharmonic respelling — different letter/inflection across the tie (e.g. eb ^d#): the second note is treated as a new note and shows the accidental, because it is the first time that letter appears in the measure.

7. Anacrusis

The anacrusis (upbeat measure) is introduced by the sign > as a marker of the initial barline of the first measure:

N) > c8 d | e4 e e e | …      # upbeat of two eighth notes before measure 1

Rules:

  • Where it applies. > is an anacrusis only in a note or chord line (C/N). In A) it is an accent, in D) a decrescendo, in M)/L) text (see neumaRk_datapack.md §3.bis for the classification filter). The > is recognized as an anacrusis only if followed by content (pitch / < / barline), so a final accent > is not confused.
  • Uncounted measure. The anacrusis measure does not enter the numbering of measures.
  • Explicit durations. In an anacrusis measure with more than one note, all events are treated as explicit: the anacrusis is partial by definition, so it is not redistributed to fill it (§3.3.1). Implicit durations are computed only based on the last explicit value received.
  • Completion rest at the start. If the anacrusis measure is shorter than the full measure, the completion rest is added at the head (not at the tail), so the events align to the strong beat that follows.

7.1 Section anacrusis (mid-song)

The anacrusis is not confined to the start of the song: an internal section (typically a Refrain after a Verse) may open on an upbeat. In that case the last measure of the previous section shows its values up to the upbeat notes excluded, and the new section starts with the anacrusis.

The case is expressed with two distinct markers, one per side:

Marker Position Row it sits on Meaning
>>> trailing the measure no content after open measure: the measure is not completed with a tail rest, because an upbeat completes it later
> leading the measure followed by content incoming upbeat: as §7, but allowed as the initial barline of the first datapack of a section, not only the first datapack of the song
[Verse]
a b | c d | a2 r8 >>>          # last measure of the verse, left OPEN

>       || [Refrain]           # Markers: `>` keeps the upbeat column empty
> g a b || c1 ...              # Notes:   `>` opens the upbeat g a b, then downbeat c1

Rules:

  • > leading vs > trailing. The same sign is disambiguated by position, exactly as §7 distinguishes the anacrusis from the accent: > followed by content (pitch / < / |) is the incoming upbeat; >>> followed by nothing is the open (outgoing) measure. The trailing sigil is fixed-form (>>>): the number of > carries no meaning.

  • >>> explicit, mandatory. The open measure requires the >>> marker: without it, a short measure receives the normal tail completion rest (standard autofill). NRK does not infer the openness from the following datapack — every datapack stays self-describing, and the marker survives reordering / moving of sections.

  • >>> is structural (propagates to the system). The open measure >>> is on a par with a measure sign / barline: it is a property of the system, not of an individual voice. It is therefore sufficient on one stave of the datapack to propagate to all the others, exactly like shared barlines (§4.1 of neumaRk_datapack.md). It must not be replicated voice by voice.

  • > incoming is per-row. The incoming upbeat > is instead per-row (as §6.4 of neumaRk_voices.md): each voice carries its own. On rows without notes (Markers, Chords) the > reserves the upbeat column, leaving it empty, so the section label ([Refrain]) and the downbeat barline align to the first real measure and not above the anacrusis. The grammar already allows it because | counts as valid content after > (> || [Refrain]).

  • Numbering. The section upbeat is not counted (as §7). The open measure preceding it is counted normally: it is a real measure of the previous section, only shorter.

  • No double rest. Unlike the initial anacrusis (§7), the section upbeat does not receive the head completion rest: it is the open measure preceding it that supplies the lead-in. The pair (open measure + upbeat) is temporally contiguous in playback. Symmetrically, the open measure does not receive the tail completion rest.

  • No metric validation. (Open measure + upbeat) are taken as written, even if they do not sum to a full measure: no warning. It remains the author's responsibility.

  • Without an open measure. If the previous section ends on a full measure (no >>>) but the new one opens with >, the > behaves as a standalone §7 anacrusis (partial upbeat with head completion rest). >>> is what links the two sides; in its absence there is no link.

  • Section barlines. NRK does not impose the typographic convention of a "double barline before the upbeat": barlines (including ||) are placed where the author writes them. The form … || c1 with the double barline on the downbeat is legitimate.

Composition with lyrics. The pickup group <…> of the LYRICS) block (neumaRk_lyrics.md §8.4.1) is the textual counterpart of this upbeat: the pickup syllables attach to the notes of the section upbeat defined here.


8. Annotations

After a note it is possible to add, adjacent to it, a textual annotation in two container forms, semantically equivalent, which differ only by the presence of the graphical box:

  • "<text>" — primary form, without box;
  • [<text>] — variant form, with box.
c4"text"          annotation without box
c4[text]          annotation with box
c4"$F1"           fingering (reserved prefix, see §8.1)

The annotation allows the text markup defined in neumaRk_text_markup.md. The default style is plain, reduced size, in both forms.

8.1 Reserved prefixes

If the first character after the container opening is $ followed by a reserved uppercase letter, markup is disabled on the entire annotation: the content is interpreted as a structural directive.

Prefix Meaning
$F fingering
$S string number

Other prefixes may be defined in future extensions.

8.2 Disambiguation with grace notes

In a note-row the delimiter […] is shared with the grace block (see neumaRk_grace_notes.md). The disambiguation is positional relative to the adjacent pitch:

Pattern Interpretation
[…]MAIN (no space after ]) grace block
PITCH[…] with whitespace or EOT after ] annotation with box
PITCH[…]MAIN (no space before or after) grace block (priority)
orphan […] (no adjacent pitch) W004 grace without main

Examples:

c4[text] d4         annotation with box on c4 (space after `]`)
c4 [d8/^]e4         grace block anchored to e4
c4[d8/^]e4          grace block anchored to e4 (grace priority)
c4 [text] d4        orphan brackets → W004 (grace ignored)

To avoid ambiguity in edge cases, it is recommended to use the primary form c4"text" for annotations: the delimiter "…" does not collide with the grace block.


9. Clef change

The default clef is the treble clef. A clef change can be defined with the notations:

  • (@G) for the treble clef
  • (@C1) for the soprano clef
  • (@C2) for the mezzo-soprano clef
  • (@C3) for the alto clef
  • (@C4) for the tenor clef
  • (@F3) or (@C5) for the baritone clef
  • (@F) or (@F4) for the bass clef
  • (@G8va) for the treble clef at the upper octave
  • (@G8vb) for the treble clef at the lower octave
  • (@F8) or (@F8vb) for the bass clef at the lower octave

The clef change is maintained in the piece until a new definition.

Disambiguation with the key. In a measure decorator (…) (see neumaRk_datapack.md §7.1) both a clef change ((@F)) and a key change ((F), (Dm)) may appear. The prefix @ identifies the clef: the clef directive is recognized before the key, so (@F) is not read as the key of F.

In a multi-staff datapack (see neumaRk_datapack.md §4), the clef declared as the first token of an N) line applies to the corresponding staff. In the absence of a directive, each staff inherits the last clef defined in its own context.

10. Non-standard notations

Slash notation

On the staff, in place of the notes, slashes (oblique bars) are drawn in number equal to the beats of the measure. There are two ways to generate it:

1. Implicit (default). In a measure with active harmony, if the note line is empty (without even rests), the measure is rendered with slash notation. Active harmony means: an explicit chord, a %, or a chord persisting from a previous measure (empty chord cell, see neumaRk_chords.md §1.1). A measure marked NC (neumaRk_chords.md §1.2) is not active harmony: with an empty note line it gets a rest, not slashes.

2. Explicit, with the construct /. The symbol / in the N) line is a language event that generates slash notation. It can be used by itself to fill the entire measure, or mixed with notes: its duration is implicit (autofill) and occupies all the space not covered by the other notes of the measure.

Examples (in 4/4):

N) a b c d  |   /        |  a b c d
Three measures: the first and third with notes, the central one entirely in slash notation.

N)   a4  /
A quarter note + slashes on the remaining three beats.

N)   /   a8  b
Slashes on the first three beats + two final eighth notes.

Rules.

  • At most one / per measure (more than one produces error E006).
  • The slash does not accept a duration: its duration is always the residual one of the measure.
  • When the slash region starts or ends in the middle of a beat (e.g. | a8 / |), an internal rest is added to close the partial beat, and the drawn slashes cover the remaining whole beats (in | a8 / | in 4/4: 1 eighth note + 1 eighth rest + 3 quarter-note slashes).
  • If after alignment to the beats no space remains for at least one slash, the / is downgraded to a rest (error E007).
  • A line composed only of / (plus barlines/dots/spaces) does not require the N) prefix: it is automatically recognized as a note line. E.g. | / | / | / | / | is already a valid note line.


Note-event extensions (sealed 2026-05-24)

Sections §11-§13 are normative and implemented end-to-end (Phases 3.2-3.3). Status/details: neumaRk_changelog.md §0.6. Impact on classification low: N) is the default sink of the cascade (neumaRk_datapack.md §3.bis), so a line with (x), (u-)…, {…} or R4 falls into Notes without touching the other predicates ({ } R are in no charset; uppercase R is free, pitches are lowercase).

11. Noteheads and note glissando (the parentheses rule (…))

In N) the parentheses are overloaded. The meaning of (…) attached to a note is determined by content (and prefix/suffix position):

Parenthesis content Meaning Position
@… (e.g. @G) clef change (§9) prefix/inline
digits / list (e.g. 4, 16,8,8) explicit rhythm (§3, also r(…)) suffix
notehead-token x d t s /, or empty notehead / parenthesized note (§11.2) suffix
direction+dash u- d- u-- d-- note glissando (§11.3) prefix = in, suffix = out

Operational discriminator: first character + presence of the trailing dash. Key case: (d) = diamond (notehead); (d-) = glissando down (the dash marks the glissando). Without the dash the two collide.

A note may combine distinct parenthesis groups (one per concept): (u-)a2(x) = short glissando-in up + a2 + cross notehead; a2(x)(d-) = a2 cross notehead + glissando-out down.

11.1 The three "slash" things not to confuse

  • standalone /: rhythmic slash-region (1 slash = 1 beat, beat-aligned), see §10.
  • (/): slash notehead on a note, at the real pitch of the note (§11.2).
  • {…}: rhythmic notation, slash centered without pitch (§12).

11.2 Noteheads

Implemented end-to-end (Phase 3.2). Status/details: neumaRk_changelog.md §0.6.

Suffix (…) on a note, closed set:

Form Notehead
(x) cross
(d) diamond
(t) triangle (single orientation; up/down variants deferred)
(s) square
(/) slash (rhythm notehead at the pitch height)
() (empty) parenthesized note (editorial / ghost)
N) a2(x) b2(/) c2() d2(d)
  • Chord-stack: <c e g>(x) applies the notehead to all the pitches of the stack.
  • A single notehead per note.

Positional overload: inside () the letter t is a triangle; outside, t is the tuplet marker (8t, §3.2); in A) it is the turn. Disambiguate by position inside/outside parentheses (rule §11). Likewise d (outside () it is not a notehead). For s: inside () it is the square notehead; outside, as a standalone token-pitch, it is the spacer (§14).

11.3 Single-note glissando (scoop / fall / doit / plop)

Implemented end-to-end (Phase 3.2b). Status/details: neumaRk_changelog.md §0.6. Co-locatable with the noteheads (a(x)(d-)).

Ornamental glissando into or out of a note (different from the glissando between two notes, which lives in A) as glneumaRk_articulations.md §9).

  • direction: u (up) / d (down); length: - short, -- long;
  • in/out from position: prefix = in, suffix = out;
  • the dash marks the glissando (distinguishes it from the notehead, §11).
Spelling Meaning Jazz name
(u-)a gliss IN up, short scoop
(d-)a / (d--)a gliss IN down plop / drop
a(u-) gliss OUT up, short doit / lift
a(d-) / a(d--) gliss OUT down fall (short / long)
N) (u-)a2 a8 a(d--) | (d-)a a(u-)

12. Rhythmic notation {…}

Implemented end-to-end (Phase 3.2c). Status/details: neumaRk_changelog.md §0.6.

A group {…} is rendered as rhythmic notation: slash noteheads centered on the staff, without pitch. { and } are new delimiters in NRK.

N) a4 r | b4 {8 8 16 16 8 4}
  • Content: only durations (no pitch); rests allowed ({8 8 r8} → rest glyphs) and spacers allowed ({8 8 s8} → rhythmic position skipped, no notehead, §14). The pitch is always centered.
  • Default notehead = slash. Override with the notehead suffix of §11.2: {8 8 16}(x) = cross noteheads.
  • Only the notes inside the braces are rendered as rhythm notation; the rest of the measure is normal.
  • Tuplets allowed inside {…} (e.g. {8t 8t 8t}); invalid tuplet marker → warning W007.

13. Multi-measure rest (MMR) RN

Implemented end-to-end (Phase 3.3): parse, empty-span validation (W008), ×N playback, dedicated MMR glyph and +N renumbering. Status/details: neumaRk_changelog.md §0.6.

RN (e.g. R4) renders a multi-measure rest of N measures: a single cell worth N measures, with the measure count advancing by N. Rendering: standard MMR glyph (thick bar) with the number N above. R is uppercase (free in N), where pitches are lowercase). Requires N ≥ 2 (R1 = single-measure rest, redundant → normal rest). (Form Rx4 discarded: RN is used, consistent with %N.)

13.1 When it is used (empty-span condition)

The barlines are shared by the system: a staff is not collapsed while another is shown. Therefore an MMR is rendered only if the entire span is empty at the system level — all voices/staves at rest and chords empty. It is useful in exactly two cases: (a) a single staff/voice with an empty span; (b) multiple staves/voices all RN aligned on the same span (including the piano grand staff at rest).

C) A |    | B          # empty chords on the central span
N) a | R4 | b          # → 4-measure MMR; measure count +4

If there is any content on the span (chords, notes of another voice, markers), RN is not the right tool: warning and degradation to N per-measure rests (one writes normal rests directly).

Corollary: since RN lives only in uniformly empty spans, there never exists another part with content to align in that span → no "expand-to-align" machinery.

13.2 RN ≠ collapse in extraction

These must be kept separate:

  • RN = "I want an MMR here, in this view" (explicit notation, empty span).
  • Collapse in extraction = automatic: when extracting a single part from a multi-part score, the empty measures of that part collapse into MMR without special notation (one writes normal rests). It is a future feature (arrives with part extraction); RN on an empty span, by contrast, is implementable right away. The choice "in the part the chords are omitted" is an extraction setting, not an MMR marker.

13.3 Boundary rules (rendering)

  • Whole measures only: if the part enters mid-measure, the whole measures go into MMR and the half-beat at the edges remains a normal rest.
  • The span breaks at: system change (line break), double barline, repeat :|/|:, key/time-signature/tempo change, rehearsal mark. E.g. R8 with a key change in the middle → two MMRs.

14. Spacer — invisible rest (s)

Implemented end-to-end (2026-05-27): parser, classification, serializer, render (GhostNote) and playback. See neumaRk_changelog.md §0.6. Impact on classification low: as for r, a line of only s falls into the default sink N) (neumaRk_datapack.md §3.bis, TB1 extended to s).

The spacer is an event that occupies duration exactly like a rest (r), but renders no glyph: it advances the metric time without drawing anything on the staff. It is borrowed from the eponymous construct in LilyPond. It serves to reserve metric space without a graphical sign: aligning a second voice or syllables (L)) by column, leaving driven "gaps" in a measure, positioning a single annotation at a point in time without a visible rest.

14.1 Syntax

s is a special token-pitch (like r): it replaces the pitch and accepts the entire duration grammar of a rest.

Form Meaning
s spacer of implicit duration (inherits from the context, §3.3)
s4 s8 s16 explicit duration (§3.1)
s4. s2.. adjacent dot (§4.1)
s8 . . spaced dot (§4.2)
s4t s8t5 inside a tuplet (§3.2)
s16*5 s16x5 multiplier (§4.3)
s !!! repetition (§5)
N) c4 s4 e4 s4        # two real events alternated with two quarter-note spacers
N) s2 g2              # first "empty" beat (invisible), then g as a half note

14.2 Semantics

The spacer is indistinguishable from r for: duration, measure count, autofill (§3.3.1) and playback (silence — inaudible event). The only difference is the graphical rendering.

r (rest) s (spacer)
Rendering rest glyph no glyph
Duration / time signature counts counts (identical)
Playback silence silence (identical)
Line classification Notes Notes

Measure entirely of spacers. The measure appears optically empty but the time advances normally. The filling measure-rest (whole rest) does not apply, nor the slash notation reserved for empty harmonic measures (§10): the spacer is an explicit choice of "no sign".

14.3 Restrictions

The spacer has no pitch nor graphical presence, so it does not accept the modifiers that presuppose a note or a visual anchor. In all the following cases the modifier is ignored with warning W009:

Spelling Outcome
^s / s^ no tie: the spacer does not tie (§6). To prolong, use the real note or r
s"…" / s[…] no annotation (§8): the visual anchor is missing
s(x) (u-)s no notehead/glissando (§11): reserved for real notes

In addition, by symmetry with r:

  • Chord-stack <…>: s inside it is not valid, silently ignored (§2.6).
  • Grace block: s not allowed as a grace event → E013 (like r, neumaRk_grace_notes.md).

14.4 No multi-measure form

There is no multi-measure spacer (SN is not defined): the uppercase S is the Style header marker (neumaRk_header.md), and an MMR (§13) is by definition a visible rest. To skip N measures invisibly one repeats s measure by measure.


15. Deduction rules (summary)

  • omitted pitch or duration are deduced from the context
  • deduction must never produce semantic ambiguity
  • in case of conflict, the explicit syntax always prevails

This document defines the atomic level of musical notation in neumaRk.