Skip to content

Articulations (A) line)

STATUS: SPEC. Binding and order are not redefined here: see neumaRk_datapack.md §2.1 and §3. History in neumaRk_changelog.md, What's new in 0.6.

1. Definition

The A) (Articulations) line carries the articulations and ornaments to apply, position by position, to the events of the music line it is bound to. It is a parallel layer: it does not alter rhythm, durations or flow, only the notational attributes of the events.

2. Structural position and binding

Marker, optionality and logical order are defined in neumaRk_datapack.md §2.1 (marker table) and §3 (implicit order: A) is optional and precedes the N) line of its own note group). In operational summary:

  • A) refers to the line immediately below ("model §4.A.5"): its tokens are held pending and drained onto that line, for the whole staff.
  • Which line:
  • if the line right below is a C) (chords), the whole A) annotates that C) — only for stave 0 (harmony lives in MeasureShared). See §2.1: marks go on the chord-rhythm heads (if the C) has rhythm), text annotations ("…", ["…"], ("…")) above the printed chord symbols;
  • if the line right below is an N), it annotates that N), same stave.
  • In multi-stave each staff has its own pending bucket; voice 2 (N2) has an independent A) bucket (see neumaRk_voices.md §3.1).
  • An A) that does not have its row below it — written under the last N) of the datapack, or followed by another A) — articulates nothing: it is ignored with W174 (neumaRk_datapack.md §4.1). The exception is a datapack with no note rows, where the A) applies to the default rests.

2.1 A) above chords (text annotations + marks)

When the target line is a C), the A) has two distinct channels, both count-aligned (§4):

  • Marks (staccato ., accent >, etc.) → anchored to the chord-rhythm heads (the rhythmic slots), if the C) carries an explicit rhythm. Rendered as signs above the head. This is the historical chord-rhythm behavior.
  • Text annotations (labels, markup allowed, with the frame of §13.1: "…", ["…"]/[…], ("…")) → anchored to the printed chord tokens, one token per column (compact-rhythm-list members such as the 2nd 4 of A(4,4), and ghosts, do not count: they are exactly the columns the round-trip re-emits). The label renders above the chord symbol; if a printed token has no chord glyph but has a rhythm head (the repeat/struck !(4)) the label anchors to the head, low, above the note.

Per-slot idiom. To place an annotation (or a mark) on the 2nd note of a rhythm, use the explicit form with printed tokens, not the compact list:

A) | "one" "two" "three" |
C) | A(4)  !(4)   D       |     // "two" above the repeat head (low)

With the compact list A(4,4) there is instead a single column for the whole group, so only one text annotation can anchor to it:

A) | "one" "two" "three" |
C) | A(4,4)       D       |     // "one"→A, "two"→D, "three" DROPS out of flow (W131)

"What you see round-trips" principle. Text annotations align only to the printed columns precisely because serialization (.nrk) re-emits them at those same positions: no surprise changes after a round-trip. A text token past the last printed column drops out of flow and emits W131 (§4).

Dashed extension line. An annotation with a glued - ("vamp"-) opens a dashed continuation line that runs at the annotation's height, above the chord band, to the right. As for notes (§13.3) and for the inline label on the chord symbol (CASO 2, neumaRk_chords.md §8.5), every column the line covers wants its own -: a standalone - on a following chord column marks it as "under the line" — the column is consumed (no label, no W131: it is consumption, not excess; like the slash / = 1 slot). The line skips over the continuation columns and stops at the first terminator column:

  • the next printed chord symbol that is not a continuation,
  • an NC (No Chord) or R (harmonic rest) bar — a fractional NC (neumaRk_chords.md §1.2.1) falls under the previous rule instead, being a printed symbol,
  • or the end of the line/piece.

There is always a downward hook at the far end (toward the staff); the line is vertically centered on the text. It is the above-the-band twin of the CASO 2 inline extension — which instead flips the label to the right of the symbol: here the label stays above, centered.

A) | "vamp"- -  -   |
C) | C-7     F7 G7 C |     // line from "vamp" (over C-7) across F7/G7, hook on C
A) | "vamp"- |    |     |
C) | C-7     | NC | Bb6 |  // the line stops at the left edge of the N.C. glyph (bar 2)

Barline anchoring. As for notes (§13.4–13.5), the chord-anchored extension can anchor to the measure borders:

  • begin-bar -"vamp" as the first A) token → the label anchors to the measure's left border (not to a symbol) and opens the line to the right.
  • terminator -| as the last token (a - glued to the border) → closes the open line on the measure's end-bar, with a hook, no text (twin of §13.5; -| glued vs - | spaced = continuation).
A) |     | -"fill"- |    |     // begin-bar: label at the left border, line → F7
C) | C-7 |          | F7 |

A) |     | -"fill"- | - -|  |  // terminator: closes on the end-bar of bar 3
C) | C-7 |          | G7 |  |

Note. A "vamp"- as the last token stays inline on that column's symbol (opening the extension from the symbol, as above), not an end-bar anchor: for chords the textual end-bar that closes an open line does not exist (use the -| terminator to close on the border).

Analysis staff { } (over chords). As for notes (§10.3), { } brackets on the A) row draw a square analysis staff over the chord span: a horizontal bar with downward legs toward the band and an optional label "…" above left. { (with optional label) opens the staff on that column's symbol, } closes it; intermediate columns use . to hold their position (per-token alignment, §4).

A) {"II-V-I" . } .
C) C-7      F7 G7 C   // staff "II-V-I" over C-7 F7 G7; C stays outside

On several lines. A ; in an annotation or in the staff label is a line break (neumaRk_text_markup.md §3bis): the stack grows upward and the last line stays where the single line would be. An annotation above a comment-label, or above another annotation on the same chord, clears the whole stack; the dashed line of "…"- starts from the last line, at its height.

A) "solo;chorus" "vamp;on C"- -
C) C-7"drop;2"   F7          G7 C

3. Vocabulary

Each token is a symbol (or combination) that maps to an articulation or ornament. Tokens are separated by spaces; multiple articulations on the same note are written as a single token without spaces (e.g. >!).

Token Meaning Type
_ tenuto articulation
> accent articulation
! staccato articulation
^ marcato articulation
+ pizzicato (left hand) articulation
o fermata (above) articulation
os short fermata articulation
ol long fermata articulation
_! portato (tenuto+staccato) combination
>! staccato accent combination
tr trill ornament
m mordent ornament
M inverted mordent ornament
t turn ornament
T inverted turn ornament
, breath mark articulation
V caesura (Luftpause) flow (extension §8+)
h harmonic articulation (extension §8+)
v up bow articulation (extension §8+)
n down bow articulation (extension §8+)
. placeholder: no articulation on that position —

h for the harmonic (the symbol ° is not ASCII and o is already fermata); v/n for the bows (n recalls the ⊓). Added to these are a per-pair token (glissando gl, §9) and two spans (slur ( ), wave ~, §10), introduced by the decomposable token model in §8.

Breath , vs caesura V. The breath mark , is a quick catch-breath in the phrasing: it does not stop the metre. The caesura (Luftpause) V is stronger — the musical flow stops, a silence is added to the ordinary duration, then it resumes. Rendered as a large V just after the note, overlapping the top of the staff. Uppercase so it doesn't collide with v (up bow).

The vocabulary is the closed set of the table above (plus the placeholder ., the per-pair/spans of the §8+ extensions). Only these tokens are valid articulations; the classification of articulation lines derives from this set (see §6 and §11). A token outside the vocabulary is not a valid articulation.

The markers > and ^ make a line uniquely articulations during classification: no other music line uses them in isolation.

Exception — FINE (flow directive, not an articulation). The token FINE (all caps) is allowed on the A) row but is not an articulation: it is the end-of-piece flow sign anchored to the note (count-aligned like any A) token). It uses the A) row only as an anchoring surface. Semantics, its rendering (same glyph as the barline FINE, centered on the note), and the precedence rule against the barline FINE (W167) are described in neumaRk_flow_and_repeats.md §4.2.1.

3.1 Chromatic ornaments (altering the auxiliary)

An ornament may play an altered auxiliary instead of the diatonic one — e.g. in C major an upper mordent on C playing C–D♭–C instead of C–D–C. The accidental is written attached to the ornament token.

Accidental alphabet (attached, right after the sign):

Symbol Meaning
# ## sharp / double sharp
b bb flat / double flat
N natural — uppercase (lowercase n is down-bow)
- (turn only) slot with no accidental

Single-auxiliary ornaments — m (upper mordent), M (lower mordent), tr (trill): one optional accidental; the side (above/below) is implied by the sign.

Write Plays (in C major)
mb C–D♭–C
m# C–D♯–C
mN C–D♮–C (forces natural against the key signature)
M# lower mordent with ♯ auxiliary
tr# trill with ♯ auxiliary

Turn — t (turn), T (inverted): two auxiliaries, so up to two slots in execution order, with - = a slot without accidental. A single accidental applies to the first-executed auxiliary.

  • t plays upper → lower ⇒ slot1 = above, slot2 = below.
  • T plays lower → upper ⇒ slot1 = below, slot2 = above.
Write Effect
t# upper auxiliary ♯ only
t-# lower auxiliary ♯ only
t#b upper ♯, lower ♭
T#b inverted: lower ♯, upper ♭
tNb upper ♮, lower ♭

The accidental does not prevent co-location with other articulations (mb> = flat-upper-mordent + accent). An excess or misplaced accidental (m#b, t#b#) falls outside the vocabulary → W139 (non-blocking). Rendered with the standard accidental glyphs above/below the sign; no dedicated font.

4. Count-based alignment

The correspondence with the events of the target line is strictly positional by count (as in neumaRk_dynamics.md §4.1), left-to-right:

A) | >  .  !  ^ |
N) | a8 b  c  d |
//   ↑      ↑  ↑
// accent staccato marcato (b: none)

Row order. An A) always binds to the notes/chords row immediately below it (unlike D)/L), which bind to the row above). So write it above the N)/C) it refers to.

  • The token . or an empty token = no articulation on that note.
  • If there are fewer tokens than notes, the remaining notes stay without articulation (no-op).
  • If there are more tokens than events, the extras are ignored (auto-fix philosophy) and A) emits W131 (token excess), like D) (§7).
  • The alignment counts rests too (unlike L), which skips them): a position above a rest is an event in every respect. This is what allows a span (§10) to cover a rest (you write ~ over it and the span continues).

5. Examples

A) | >    !  |
N) | c4 d e f |     // accent on c, staccato on e

A) | >!         |
C) | C7  F7     |     // staccato accent on the first chord-rhythm event (stave 0)

6. The vocabulary: closed set and single source

This document is the single source for articulations. It defines each NRK-token → musical meaning (e.g. ! → staccato); the meaning is normative, while how a renderer draws it is not (another renderer may pick different glyphs).

The vocabulary is a closed set: symbols outside the §3 table (for example _ or isolated letters) are not valid articulations. It also takes part in line-type deduction: a prefix-less line is classified as A) by recognizing its tokens against this vocabulary.

7. Decisions

  1. Single source — the spec is normative; a classification charset and a renderer's glyph map both derive from the §6 table.
  2. Closed vocabulary — symbols outside the table (e.g. _, isolated letters) are not valid articulations.
  3. Token excess — A) emits W131, like D).
  4. Meaning is normative, rendering is not — the musical meaning of each token is binding; the glyph a renderer uses is an implementation choice.

Diagnostics: a token that carries material beyond the vocabulary emits W131 (token excess); a token containing an out-of-vocabulary sequence emits W139 (lexical validation), including a stray letter-fragment such as the s of os or the r of tr.


A) Extensions

Sections §8-§12 are normative. They extend the per-position vocabulary of §3 with: a decomposable token model (§8), a per-pair token (glissando gl, §9) and two spans (§10).

8. Token model: decomposition and co-locations

The base vocabulary (§3) can be matched as whole tokens. The extensions require a true per-position decomposer, like the one D) uses for its dynamics (see neumaRk_dynamics.md).

Each position (space-separated token) is an order-free concatenation of elements, decomposed with greedy longest-match over the multi-char atoms (first os/ol before o, first tr before t):

element :=
  | wave            ~[1-4]? "…"?         // §10.2 (digit/label only at opening)
  | text            "…" | ["…"] | […] | ("…")   // §13.1 (frame model)
  | slur-open       (                    // §10.1 (but the exact `("…")` is text)
  | slur-close      )                    // §10.1
  | bracket-open    { "…"?               // §10.3 (label only at opening)
  | bracket-close   }                    // §10.3
  | octave-open     8u | 8d              // §10.4 (up / down)
  | octave-close    8.                   // §10.4 (8 + dot)
  | glissando       gl                   // §9 (towards the next note)
  | fermata         o | os | ol          // greedy: os/ol before o
  | trill           tr                   // greedy: tr before t
  | turn            t | T
  | mordent         m | M
  | per-note 1ch    _ > ! ^ + , h v n V   // V = caesura/Luftpause (§3)
  | line            -                    // §13.3 (continuation of the dashed line)
  | placeholder     .                    // no element on that position

Whole tokens outside the decomposer. FINE (a flow directive on A), neumaRk_flow_and_repeats.md §4.2.1) is not a per-position element: it is a whole token handled before the decomposer. V (caesura) is instead a single-char per-position element, like >/^.

Consequence: _! and >! are co-locations, not atomic tokens (_+! = portato; >+! = staccato accent). All combinations emerge from concatenation: (! = slur-open + staccato; >gl = accent + glissando. The "combination" entry of the §3 table remains valid as a meaning, not as an atomic token.

Exception: span delimiters are ordered. Among the elements that open and close a delimited span (( ) §10.1, { } §10.3, 8u/8d 8. §10.4), the order in which they appear in the position matters:

  • close then open = concatenation: the note ends one span and starts another of the same kind ()(, }{, 8.8u);
  • open then close = degenerate ((), {}, 8u8.): → warning, see the individual sections.
A) ( . )( . )
N) c d e  f g      // two slurs: c→e and e→g

Per-note marks stay order-free, delimiters included: !)(, )(! and )!( are equivalent.

Decomposing a position into its per-note marks is a separate step from resolving the spans it opens or closes (§10) — the same separation D) applies to its dynamics and hairpins.

9. Note-to-note glissando (gl)

gl on the position of a note = that note glides towards the next. The direction (up/down) is implicit from the two pitches. It is per-pair, not a span.

A) .  gl .  .
N) r4 a  b  r       // a glides towards b

Distinct from the single-note glissando (scoop/fall, entry/exit from one note), which lives in N) as a modifier between parentheses — see neumaRk_notes_and_durations.md (N extensions).

10. Spans

Spans borrowed from the D) model (open/close resolved in a post-pass).

A span lives on the logical staff: the same staff across all datapacks, according to the identity of neumaRk_datapack.md §4.5. A change of datapack or system does not interrupt it; its close does. A delimited span ({ }, 8u…8.) never closed → warning, and it stops on the last note of the system where it opens (its datapack). The slur ( ) is the exception: a ( with no close is legal and reaches the next note (§10.1). Spans are resolved per voice: an A) in the N2 group (neumaRk_voices.md §3.1) opens and closes spans on the notes of voice 2, independent of those of voice 1 (a voice-1 ( does not close on a voice-2 )).

10.1 Slur ( ) (delimited span)

LilyPond style: ( opens on the note of its position, ) closes on the note of its position; the curve covers from opening to closing.

A) . ( . . )
N) c d e f g      // slur from d to g
  • Cross-barline / cross-system: yes. At a system break the curve splits into two arcs: one leaves the end of the first system, the other enters at the start of the next.
A) | . . ( . |
N) | c d e f |

A) | . ) . . |
N) | g a b c |      // slur from e to a, across the system break
  • Chained phrases: )( on the same note closes one slur and opens another (§8, ordered delimiters).
  • ( without ): slur to the next element (legal, no warning). A ( not followed by a ) before the next ( of the same voice (or before the end of the piece) reaches the next element written in the source: the note after the opening one. It is the two-note slur, the most common one, written with a single sign:
A) !    (  !  (  !  (  !  (  | !
N) a8 b c d e d c b | a      // four two-note slurs: b-c, d-e, d-c, b-a

The next element is counted on the source: a note the renderer splits for readability (dotted on the beat, across the barline) is one element, grace notes do not count (they belong to the main note), the arrival note of a ^ tie does (it is written). Neither the N) prolongation . (it lengthens the note before: in c4 . d the slur goes from c to d) nor the rests the parser adds to complete a short measure count; the slash / counts, like a note. It also works across the barline and the system break (§10: the span lives on the logical staff). If the next element is a rest → warning (W144.slur_unclosed_rest) and no slur: a slur landing on a rest is not notation, it is almost always a forgotten close. A ( on the last note of the logical staff, with nothing after it → warning (W144.slur_unclosed_eol) and no slur. - One slur at a time, by choice: nesting and overlap are not part of the notation. They are 1% of real cases, and telling two open slurs apart would need an identifier for each. So a ( while a slur is already open does not overlap it: the open slur becomes a two-note slur (rule above) and the new ( opens its own. ( ( . ) is therefore two slurs, from the 1st to the 2nd note and from the 2nd to the 4th; in ( ( . ) ) the second ) is orphan. Two ( on the same note → warning (W144.slur_open_overlap), the second is ignored. - Orphan ) → warning (W144.slur_close_unmatched), ignored. - Open+close on the same note (()): degenerate → warning (W144.slur_degenerate), ignored. - Co-locatable with the per-note ones: (! = slur-open + staccato.

10.2 Wave ~[1-4] (span by repetition)

A wavy line always above the staff. It unifies vibrato / shake / long-vibrato / laid-back: the amplitude is the visual width, the label gives its name.

Amplitude — optional digit 1–4 (default ~ = level 1):

  • ~N (with digit) opens a new span of amplitude N, closing the current one;
  • ~ (bare) extends the current span; if none is open, opens one of level 1.
A) ~3 ~ ~ ~1 ~ ~      // large wave over 3 notes, then small wave over 3

Extension and rests: consecutive ~ (even cross-barline) = a single wave; a position without ~ (including an empty measure) closes the span. Rests do not interrupt (the alignment counts rests, §4).

A) ~2 ~ ~ ~ |   | ~3 ~ ~ ~
N) a4 b r c | d | a4 b r c
//  └─ amplitude-2 over a b r(rest) c ─┘  (meas.2 empty → no wave)  └─ amplitude-3 ─┘

Label (optional, only on the opening token): "…" immediately after the wave, rendered above its start. The label is a text markup container (neumaRk_text_markup.md §2.2): it accepts the #/##/###, */**, __ markers; the default is upright (italic/bold/underline/size only via the markers). Amplitude and label are independent.

A) ~3"shake" ~ ~ ~
A) ~"vibrato" ~ ~
A) ~4"laid back" ~ ~ ~ ~

The label gives the semantics (vibrato vs shake vs laid-back); the glyph ~ alone is only "wave of amplitude N". For a transcription tool the page is the truth; an eventual performer will infer from label/amplitude.

10.3 Analysis staff { } (delimited span)

A grouping bracket above the staff, like the analytical brackets of formal analysis. { opens on the note of its position, } closes on the note of its position (LilyPond style, exactly like the slur §10.1).

A) . . {"DO triad" . | } |
N) a a c        e | g e c a
  • Label (optional): a string "…" immediately after { (reuses the same opaque token as the wave). Rendered left-aligned above the opening and is a text markup container (neumaRk_text_markup.md §2.2: #/*/__), upright by default. A bracket without label ({ … }) is allowed.
  • Rendering: square bracket always above the staff, with the two ends turned downward (toward the notes).
  • Cross-barline / cross-system: yes.
  • One bracket at a time, by choice (like the slur, §10.1, but without its two-note slur: a bracket has no "two-note" idiom): a second { while one is open → warning (W144.brace_open_overlap), ignored together with the } that closes it, and the outer bracket remains; an orphan } → warning (W144.brace_close_unmatched); a degenerate {} (open+close on the same note) → warning (W144.brace_degenerate); a bracket never closed → warning (W144.brace_unclosed_eol) and implicit close on the last note of the system where it opens.
  • Purely graphic: no effect on musical content (it is an analytical annotation).
  • Syntax note: in A) rows { … | … } is a bracket spanning a barline, so the inner | is a real barline. The map suppresses polychord detection on Articulations rows.

10.4 Octave 8u / 8d … 8 (delimited span)

An ottava line. 8u opens an octave up, 8d an octave down; 8. closes the span (inclusive on the last covered note). Delimited like the slur (§10.1) — deliberately NOT the extension model of the wave (§10.2): the ottava line is sparse, so repeating a token on every note would be cumbersome. A bare 8 (without u/d/.) is out of vocabulary (likely a typo for 8.) → W139.

A) . . . . . . . 8u | . . . 8. |
N) c8 d e f g a b c  | d e f e d c b a
//                 └─ 8va from the 8th note, across the barline, to the close ─┘
  • Rendering: the standard SMuFL ottava sign — 8va (alta) / octave down (the visible spelling, "8ba" or "8vb", depends on the font) — followed by a dashed horizontal line and an end hook toward the staff; above for 8u, below for 8d. (Reference rendering, informative: glyphs U+E511 and U+E513 ottavaBassaBa, in the BravuraLS/PetalumaLS subset.)
  • Effective pitch: the covered notes are worth ±12 semitones (8u = +12, 8d = −12) relative to the written pitch, which is unchanged — the noteheads stay where they are. It is the very sense of the ottava: written in one position, read an octave above/below.
  • Cross-barline / cross-system: yes.
  • One octave at a time, by choice (like the slur, §10.1, but without its two-note slur: an 8u with no 8. is a forgotten close, and it changes the effective pitch): a second open while one is open → warning (W144.octave_open_overlap), ignored together with the 8. that closes it, and the outer octave remains; an orphan 8. close → warning (W144.octave_close_unmatched); a degenerate 8u8. → warning (W144.octave_degenerate); an octave never closed → warning (W144.octave_unclosed_eol) and implicit close on the last note of the system where it opens.

Span convention (decided for A), to be reused by the D) hairpins/ cresc.): every long span is delimited — a (possibly parametrized) opening token + a closing token; intermediate positions are placeholders .. Slur ( ), bracket { } and octave 8u…8 follow it. The wave ~ keeps the extension model as the single documented exception, because its glyph is a continuous wavy line drawn over every covered note.

11. Impact on deduction (extended charset)

The extensions broaden the line classification surface (neumaRk_datapack.md §3.bis):

  • Charset A): includes the new symbols ( ) ~ h v n g l V and the digits 1-4, plus { } 8 u d (§10.3 bracket, §10.4 octave), in addition to the base vocabulary §6 (from which the charset is derived — single source). Note: l appears in gl/ol; V is the caesura (§3). [ ] is the box ["text"] (§13.1) and ("text") the round frame (§13.1); the analysis staff uses { }.
  • ~ is a specific marker: a line that contains ~ is classified uniquely as A), despite the digits that would otherwise bring it closer to chords/notes.
  • { } 8 d are NOT specific markers: 8/d = duration/note. They only widen the A) charset; the notes-line priority (TB4) protects N) rows, and an implicit bracket/octave row needs the explicit A) prefix to be classified as articulations.
  • g/gl vs note G — TB4: g (head of the gl glissando token, §9) is also the note G, and with the durations 1–4 it makes lines like g, g4, g g g ambiguous. The TB4 rule (neumaRk_datapack.md §3.bis.5) gives priority to notes: a line that is a valid notes-line (every token matches the canonical notes grammar + at least one real pitch) is N), not A). The token gl is not a valid note, so an articulations line with gl stays A).
  • Quote-aware: the content of a label "…" (e.g. shake) is excluded from the classification match — out-of-charset letters or a ~ inside the text neither break nor falsely mark the line.

12. Decisions (extensions)

  1. Note-to-note glissando (gl, §9) ≠ single-note glissando (scoop/fall, in N)). ✓
  2. Extended vocabulary = closed set; normative meaning, rendering is an implementation choice (inherits §6/§7). ✓
  3. Unified token model (decomposer + co-locations, §8); order-free except span delimiters, where close-then-open = concatenation. ✓
  4. Slur ( ) delimited, cross-system, chainable with )(; one at a time by declared choice, not deferral: the excess ( is ignored together with its ) (§10.1). ✓
  5. Up bow v, down bow n; harmonic h (§3). ✓
  6. Wave ~: levels 1–4; digit = new span, bare = extends; always above; covers rests; label "…" at opening, upright (§10.2). ✓
  7. Shake / long-vibrato / laid-back unified in the wave ~N + label. ✓
  8. Analysis bracket { } delimited, label "…" optional, always above, purely graphic; one at a time by choice, like the slur (§10.3). ✓
  9. Octave 8u/8d … 8. delimited (8. closes), dashed line above/ below, effective pitch ±12; one at a time by choice, like the slur (§10.4). ✓
  10. Span convention: long spans are delimited (open + close); the wave is the single exception (extension), its glyph being a continuous line. ✓

A) text-line (unified with D))

Normative section. Brings to A) (above the staff) the free text with a dashed continuation line that D) already has below the staff (neumaRk_dynamics.md §5–§6), with an identical vocabulary. A) above, D) below: same tokens. ("Identical" refers to the text + anchoring sub-vocabulary of §13.1: the graphic hairpins </> of D) do not apply in A), where > is the accent, §3.) It is the idiomatic Sher role of "dr. fill ----|", "rhythm tacet ----|". In A) the tenuto is _ (§3), so - is free for this role.

13. Text labels and the dashed line

Beyond the per-position articulations (§3) and the geometric spans (§10), A) hosts free texts anchorable to a note or to a barline, rendered with a dashed continuation line. The model is the above-staff twin of the D) text annotations: the rules for opening, continuation, closing and barline anchoring are the same as neumaRk_dynamics.md §5–§6; here we list the vocabulary, the A) specifics and the -| terminator (new, common to A) and D)).

13.1 Vocabulary (identical to D))

Form Role D) ref.
"text" / ["text"] / ("text") note-anchored text annotation (frame: §13.1 below) §3.4
"text"- (not the last token) opens the dashed line §5.2
- standalone (spaced) continues the line, crosses barlines §5.3
-"text" (first token) anchors to begin-bar §6.2
"text"- (last token) anchors to end-bar §6.3
-"text"- (first token) begin-bar + opens a cross-bar line §6.4
-\| (last, glued to the border) terminator: closes on the end-bar, hook, no text §13.5

The label is a text markup container (neumaRk_text_markup.md §2.2, #/*/__), upright type by default — like the wave/bracket labels (§10.2, §10.3). It follows the frame model (neumaRk_text_markup.md §2.1) in every position of the table (note, begin-bar, end-bar, with or without a line):

  • "text" — no frame;
  • ["text"] — box (reference form); [text] is its shorthand, with the same result. In A) the analysis staff uses { } (§10.3), so [ ] is available for the box;
  • ("text") — round frame. Only the exact form: ("dolce" … ) stays a slur (§10.1) that starts with a text.

The co-locations are those of §8: ("x")- opens the line, -("x")- opens from the begin-bar, ("x")! and >("x") sit next to a per-note mark. The same forms apply to A) text above a C) line (§2.1).

13.2 Note-anchored annotation

"text" (or ["text"], ("text") with a frame) on a position = a label anchored to that note, left-aligned above it. It is punctual until followed by an adjacent - (§13.3).

A) "dr. fill" . . .
N) a8 b c d          // label "dr. fill" above the 1st note

13.3 Dashed line (note → note)

The same three rules as neumaRk_dynamics.md §5: an adjacent - (glued) opens the line; a standalone - (spaced) continues it, even across barlines (§5.3, §5.5); a new element without - — or the end of the system — closes it. The line covers the notes reached by the continuations and stops just before the onset of the closing event.

A) "dr. fill"- - - .
N) a8 b c d          // dashed line from note 1 to note 4, hook on the last one

13.4 Barline anchoring

Identical to neumaRk_dynamics.md §6: -"text" as the first token of the measure anchors to begin-bar; "text"- as the last token anchors to end-bar; -"text"- opens a cross-bar line. The content of A) for each measure is the text between two barlines, excluding every border decorator (§6.1): the composite border is a property of the line, common to all music lines, and must not be replicated.

A) -"vamp"- - |  |
N) a1     | b1 |     // begin-bar "vamp", cross-bar, closes on the 1st note of measure 2

The "text"- that opens reclassification also applies (twin of neumaRk_dynamics.md §6.4): a "text"- last-token, when no line is open and the next measure continues, opens a cross-bar line reclassified as a note-anchored opening on the measure's last event (rendered on the note — e.g. the first slash — not at the barline). E.g. A) | . "riff"- | - puts "riff" on the first slash.

13.5 Terminator -|

The -| terminator closes the line on the end-bar, no text (neumaRk_dynamics.md §2), unlike closing on a note (§13.3). The terminator is a - glued to a composite border as the last token of the measure:

A) -"vamp"- - | - -|
N) a1     | b1  |     // the line closes on the end-bar of measure 2, hook on the border
  • Prefix of the whole border, uniform (no special case per decorator): -|, -:|, -:open|, -:x3|, -||, -|., -DCal@| → the parser strips the leading - (= "close span + hook"), the rest is the normal border.
  • Glued/spaced discriminator: -| (glued) hooks the border; - | (spaced) is a continuation - that crosses the barline.
  • Applies to D) too (same form, same effect: neumaRk_dynamics.md §6.6).

13.6 Rendering

Label left-aligned; dashed line starting after the text; hook ALWAYS at the end, turned toward the staff — down for A) (which is above), up for D) (which is below). It is the same graphic primitive as the octave (§10.4, dashed line + hook). The terminator extends the line to the right edge of the staff, with a hook on the end-bar. The line is vertically centered on the text height. A) and D) are mirror images.

On multiple lines. A ; in the label breaks the line (neumaRk_text_markup.md §3bis), also in wave (§10.2) and bracket (§10.3) labels: the stack grows upward and the last line stays where the single line would be. Lines are left-aligned, right-aligned only at the closing barline ("…"- as last token); a single frame (box or round frame) wraps the whole stack; the dashed line starts from the last line, at its height. A chord symbol above the annotated note rises above the whole stack.

A) "rit.;poco a poco"- - - - | - - - . |
N) c4 d e f                  | g a b c |

13.7 ⚠ Authoring: every note wants its own continuation

The begin-bar -"text"- only opens the line: it does not automatically cover the notes of the measure. As in D), every note under the line wants its own continuation - in its own column. The consequences, verified with the parser:

  • A note without an A) token is a closing event: the line ends just before its onset.
  • Continuations cross barlines with no special syntax (§5.5); to prolong the line beyond the measure, keep placing - column by column.
  • A - standalone in a new measure with no span open is orphaned: it reopens nothing.

Correct recipes (verified; whole/half notes, 1–2 notes per measure):

// (a) closes on a note — cross-bar
A) -"vamp"- - |  |
N) a1     | b1 |          // → line from the begin-bar of m.1 to the 1st note of m.2

// (b) closes on a barline — terminator
A) -"vamp"- - | - -|
N) a1     | b1  |         // → line from the begin-bar of m.1 to the end-bar of m.2

Typical confusion (to avoid): opening with -"text"- without continuations covering the measure, and placing a lone - in the next measure:

A) -"vamp"- | - |
N) a1      | b1 |         // ✗ the line closes immediately on the 1st note of m.1;
                          //   the `-` of m.2 is orphaned (reopens nothing)

13.8 - is the line continuation (not tenuto)

In A) the - is the line continuation (§13.3); tenuto is _ and portato is _! (§3). Staccato ! and staccato-accent >! are unchanged.

13.9 Decisions (text-line)

  1. Unified model A) = D): same vocabulary, A) above and D) below, mirror renderings (§13.1, §13.6). ✓
  2. Terminator -| = prefix of the whole composite border, uniform, common to A) and D); fills the end-bar gap (§13.5). ✓
  3. Every note wants its own continuation -; a note without a token = closing; an orphan - reopens nothing (§13.7). ✓
  4. Box ["text"] in A) uses the square brackets (the analysis staff uses { }, §10.3). ✓

14. Diagnostics

Code Condition
W131 Tokens in excess of the events of the row below (W131.excess_articulation); above C), text beyond the printed chord columns (§2.1, §4)
W133 Text container not closed within the measure: the rest of the measure is read as text (neumaRk_text_markup.md §6.2)
W139 Token outside the vocabulary, including a bare 8 (§3, §10.4)
W144 Malformed span: slur (slur_*), analysis bracket (brace_*), ottava (octave_*) (§10.1, §10.3, §10.4)
W167 Note-anchored FINE in conflict with FINE on the barline (neumaRk_flow_and_repeats.md §4.2.1)
W174 A) row without its row below: ignored (§2)