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:
- Tie to the preceding note (
^), optional - Pitch, optional because deducible
- Forced accidental (
!), optional
(allowed only if the pitch is explicitly indicated) - Octave modifiers, optional
(relative octaves via'or,, or absolute octave) - Duration, optional
- explicit duration (power-of-2 number, with optional dots or multipliers);
- tuplet indicators;
- or
?for unknown duration - Annotations, optional, between double quotes
- 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 asc@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:
- the
_that closes@<n>_on the first pitch is mandatory (it is the separator required by the notation); - 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 asa@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 affectcof 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) ands(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:
- if it is the only note of the measure, it occupies the entire duration of the measure;
- the last explicit duration encountered in the musical context is used;
- 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:
S ≈ M(within tolerance) → the measure is valid, no action.S > M(excess):- if trailing implicits exist and the recomputed duration
(M − S + sum_of_trailing_implicits) / number_of_trailing_implicitsfalls on a representable rhythmic value (power of 2 with 0 to 3 dots) → silent redistribution over those implicits. Typical idiom:c2 d ein 4/4 →d/einherit the half note (total 1½ whole notes), are compressed to quarter notes; - 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 4in 4/4) and the non-representable implicit excess. S < M(deficit):- if a tuplet has remained open, it is first completed (§3.2.2);
- 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). InA)it is an accent, inD)a decrescendo, inM)/L)text (seeneumaRk_datapack.md §3.bisfor 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 ofneumaRk_datapack.md). It must not be replicated voice by voice. -
>incoming is per-row. The incoming upbeat>is instead per-row (as §6.4 ofneumaRk_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… || c1with the double barline on the downbeat is legitimate.
Composition with lyrics. The pickup group
<…>of theLYRICS)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
(…)(seeneumaRk_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
N) a4 /
N) / a8 b
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 theN)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-)…,{…}orR4falls into Notes without touching the other predicates ({}Rare in no charset; uppercaseRis 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 lettertis a triangle; outside,tis the tuplet marker (8t, §3.2); inA)it is the turn. Disambiguate by position inside/outside parentheses (rule §11). Likewised(outside()it is not a notehead). Fors: 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 gl — neumaRk_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
RNlives 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);
RNon 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.R8with 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 forr, a line of onlysfalls into the default sinkN)(neumaRk_datapack.md §3.bis, TB1 extended tos).
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
<…>:sinside it is not valid, silently ignored (§2.6). - Grace block:
snot allowed as a grace event → E013 (liker,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.