Skip to content

Official Changelog


neumaRk 0.6.0 — Current version (in development)

Reference version declared by the examples in the specification (nrk:0.6). It extends 0.5.0 with a broad wave of features, listed below.

What's new in 0.6

0.6 extends 0.5.0 with the following features; each is specified in the referenced document.

Feature Document
Grace notes neumaRk_grace_notes.md
Second voice N2 neumaRk_voices.md
Staff continuity N+ / multi-stave neumaRk_datapack.md §4
Measure repeat % neumaRk_flow_and_repeats.md §7
Polychords [top\|bottom] neumaRk_chords.md §6
Comment-label / alternate chords C+ neumaRk_chords.md §7
Harmony persistence (empty cell + leading . continuation) + no-chord NC neumaRk_chords.md §1.1-1.2
Unified text markup neumaRk_text_markup.md
Collapsible sections [? …] / [!] neumaRk_markers.md §4
Extended dynamics D) neumaRk_dynamics.md
Play directive (=Style,Tempo) neumaRk_play_directive.md
PLAY) / FORM) neumaRk_play_and_form.md
Versions %%NAME … %%end neumaRk_versions.md
Articulations A) (base + extensions §8-12) neumaRk_articulations.md
Lyrics L) + LYRICS) block neumaRk_lyrics.md
Extended notes N) (noteheads, glissando, rhythm {}) neumaRk_notes_and_durations.md §11-12
Multi-measure rest RN neumaRk_notes_and_durations.md §13
Spacer s (invisible rest) neumaRk_notes_and_durations.md §14
Section anacrusis (>>> open measure + > mid-song upbeat) neumaRk_notes_and_durations.md §7.1
Collections (book / playlist) neumaRk_collections.md

Notable normative changes in 0.6

Beyond the new features, 0.6 introduces a few changes to syntax or codes relative to earlier drafts:

  • LYRICS) block codes renumbered to W157/W158. An earlier draft had the LYRICS) block share W152/W153 with Collections; every code now has a single meaning (Collections: W152W156; LYRICS) block: W157 = non-existent section, W158 = pickup overflow).
  • Optional-section close: [!] replaces [?] (neumaRk_markers.md §4.2). [!] is an anonymous non-optional section-open marker; it closes the preceding optional scope as a consequence of the general rule §4.1.
  • Measure repeat % with span N>1: the token appears in each of the N consecutive measures in the run (e.g. | a | b | %2 | %2 |), preserving the "one cell = one measure" invariant (neumaRk_flow_and_repeats.md §7).
  • An empty chord cell now makes the harmony persist (previously: silence). A C) measure with no symbols/%/NC re-realizes the previous chord on the downbeat (neumaRk_chords.md §1.1). To explicitly declare the absence of harmony, use the new NC token (§1.2, N.C. glyph, error E128 if mixed with a chord). The implicit slash-notation trigger changes accordingly: it now includes persisting harmony and excludes NC (neumaRk_notes_and_durations.md §10).

Diagnostic-code convention

  • E###error: invalid construct, emitted as a blocking error (LOG_ERROR).
  • W###warning: non-blocking diagnostic, best-effort (LOG_WARNING); parsing continues.

The prefix indicates the severity, not the category. The entire 0.6+ diagnostic family (W130W158: dynamics, articulations, play directive, PLAY) / FORM), collapsible sections, versions, HV), collections, LYRICS) block) is emitted as a warning and has been renamed from E13x/E14x/E15x to W13x/W14x/W15x to align the prefix with the actual severity.

The two tables below — base codes (pre-0.6 and fundamental) and 0.6+ codes — together form the complete, authoritative map code → meaning, aligned with the parser. Each code has a single meaning. Internal codes E901E905 are dev-facing (EN-only) and not normative.

Base code allocation (pre-0.6 and fundamental)

Code Meaning Family (doc)
E001 Uninterpretable token: note / grace event / chord-stack <…> / rhythm group {…} malformed or not closed Notes & durations / Grace
E002 A duration cannot follow . or ! Notes & durations
E003 Invalid tuplet Notes & durations
E004 Cannot parse pitch Notes & durations
E005 Note durations exceed the measure meter Notes & durations
E006 More than one slash-rhythm / per measure Notes & durations
E007 Slash / has no room (less than one beat after beat alignment) Notes & durations
E008 Absolute octave @<n>_ requires an explicit duration Notes & durations
E009 Missing duration on first grace event, or non-conforming (only 4/8/16) Grace notes
E010 Modifier / or ^ allowed only on the block's last grace event Grace notes
E011 Empty grace block [] Grace notes
E012 Grace block with more than 4 events Grace notes
E013 Rest not allowed as a grace event Grace notes
E101 Compact rhythm list / polychord / chord expression unparsable Chords
E102 Unrecognized token in the chord line Chords
E110 Too many staves in datapack (max 4) Datapack / multi-stave
E122 N) without match: more continuations than staves in the previous datapack (use N+) Datapack (N+)
E123 N2 without a valid parent stave Voices
E124 Duplicate N2 on the same stave Voices
E125 Key directive not allowed on an N2 row Voices
E126 More than one comment-label on the same chord / group / row Chords (alternate)
E127 Max 2 alternative C+ rows per datapack Chords (alternate)
E128 NC mixed with other content in the same measure Chords
E300 Measure-repeat (% / RN) with no valid source Flow / MMR
E301 Cannot parse the key-signature note Header / key
W002 Tuplet not closed before measure end (auto-filled with 1/64 rests) Notes & durations
W003 Grace block not adjacent to the main note (ignored) Grace notes
W004 Grace block without an adjacent main note (ignored) Grace notes
W006 Pitch outside the MIDI range [1..127] Notes & durations
W007 Invalid rhythm-notation token {…} (duration or tuplet) Notes & durations
W008 Multi-measure rest RN over a span with content: degraded to a normal rest Notes & durations (MMR)
W009 Modifier not allowed on spacer s (ignored) Notes & durations (spacer)
W103 Unrecognized chord suffix Chords
W301 Could not deduce title or credits from the first header line Header
W400 Chord-rhythm note with non-positive duration (omitted) Chords (rhythm)

0.6+ code allocation (single source)

The A)/D)/L) lines share W131 (excess tokens) by semantic identity, not by collision.

Code Meaning Family (doc)
W130 D) without a valid parent N)/N+/N2 line Dynamics
W131 Tokens in excess of the N) events A)/D)/L) (shared)
W132 D) token - not reducible to extension/barline Dynamics
W133 Text container not closed at end of line Dynamics
W134 Empty play directive (=) Play directive
W135 Reversed slot order (tempo before style) Play directive
W136 BPM out of range (10–999) Play directive
W137 Invalid NRK figure in metric modulation Play directive
W138 Play directive in a line other than M) Play directive
W139 A) token outside the vocabulary Articulations
W140 More than one FORM) section PLAY/FORM
W141 Invalid |BARS duration (1–999) PLAY/FORM
W142 Repeat count xN out of range (2–99) PLAY/FORM
W143 Keyword &xxx not reserved PLAY/FORM
W144 Malformed A) slur (not closed at end of line) Articulations
W145 FORM) not at the end of the document PLAY/FORM
W146 Redundant [!]: no optional section to close Markers
W147 %%NAME block not closed (missing %%end) Versions
W148 Orphan %%end (no open block) Versions
W149 Nested %%NAME block Versions
W150 Malformed HV) Versions
W151 Collapsible section not at start of line (§4.7) Markers
W152 item: line in an nrk-book: collection Collections
W153 Unknown override key in item: Collections
W154 item: line not followed by a song block Collections
W155 Collection header directive after the first block Collections
W156 Collection with no song blocks Collections
W157 LYRICS) [NAME] references a non-existent section (reference-broken) Lyrics (LYRICS) block)
W158 LYRICS) pickup group <…> overflows the available preceding-notes run Lyrics (LYRICS) block)

Historical note: W144 had also been drafted for "nested PLAY)", a case structurally prevented by the parser (never emitted); the code therefore remains with the articulations. The collapsible-section-not-at-start-of-line case was moved from W147 (which collided with Versions) to W151 (2026-05-26).


neumaRk 0.5.0 — First public release

Status

Public preview. The language is usable and coherent, but subject to short-term evolution.

Version meaning

This is the first public release of neumaRk. The number 0.5 reflects an already advanced conceptual maturity, while not guaranteeing definitive stability of the semantic interface.

Included features

  • datapack-based structure
  • header with conservative deduction
  • notes with implicit and explicit durations
  • chords with rhythmic semantics and implicit/explicit durations
  • chords with a compact duration list X(a,b,r16,c,...) (see §4.4)
  • repeat and flow management
  • support for Compact / Human / Verbose formats

Normative clarifications

  • persistent musical context
  • contextual semantics of symbols
  • priority of a single note in the measure
  • deducible Format line

Not yet stabilized

Historical list as of 0.5.0. The current state of these items is in the table in §0.6.0 (many are now stabilized and implemented).

  • articulations, dynamics, lyrics
  • polychords (syntax [top|bottom], see neumaRk_chords.md §6)
  • multi-stave per datapack (up to 4 staves, see neumaRk_datapack.md §4) — spec described, runtime implementation in progress
  • measure repeat (syntax % / %! / %2 / %!2 / %4 / %!4, see neumaRk_flow_and_repeats.md §7) — spec described, note-row implemented; chord-row N>1 and first-measure validation not yet
  • possible syntactic extensions
  • refinement of the deduction rules
  • complete formal validation

Compatibility

There are no previous public versions.