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 toW157/W158. An earlier draft had theLYRICS)block shareW152/W153with Collections; every code now has a single meaning (Collections:W152–W156;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/%/NCre-realizes the previous chord on the downbeat (neumaRk_chords.md§1.1). To explicitly declare the absence of harmony, use the newNCtoken (§1.2,N.C.glyph, errorE128if mixed with a chord). The implicit slash-notation trigger changes accordingly: it now includes persisting harmony and excludesNC(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 (W130–W158: 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 E901–E905 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:
W144had also been drafted for "nestedPLAY)", 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 fromW147(which collided with Versions) toW151(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], seeneumaRk_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, seeneumaRk_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.