Vai al contenuto

Datapack

1. Concetto di datapack

Un datapack è l’unità strutturale fondamentale del contenuto musicale in neumaRk.

Rappresenta un blocco verticale di informazione musicale sincronizzata nel tempo, tipicamente corrispondente a uno o più righi allineati:

  • markers
  • accordi
  • note
  • diteggiatura
  • articolazioni
  • dinamiche
  • lyrics
  • formattazione

Ogni datapack descrive una sequenza temporale coerente (una o più misure consecutive). I datapack musicali sono separati tra loro da uno o più righi vuoti, che hanno valore di delimitazione strutturale. La presenza di una riga vuota implica la conlusione del datapack precedente.


2. Tipi di righe

Ogni riga del datapack ha un tipo semantico.

Il tipo può essere:

  • esplicito, tramite marcatore
  • implicito, dedotto dal contenuto e dalla posizione

2.1 Marcatori espliciti di riga

I marcatori espliciti sono:

  • una, due o tre lettere maiuscole
  • seguite da )
  • seguite da uno spazio
Marcatore Tipo
M) Markers
C) Chords
$) Fingering
A) Articulations
N) Notes
D) Dynamics
L) Lyrics
F) Format

I marcatori sono opzionali, tranne $), che non è mai dedotto (§3.bis.1).

$) (diteggiatura, neumaRk_fingering.md) è l'unico marcatore il cui primo carattere non è una lettera maiuscola: resta largo 2 caratteri come gli altri, preservando l'invariante di allineamento verticale.

Il marker N) ammette due varianti morfologiche di 2 caratteri, previste esplicitamente dalla specifica:

  • N+ — nuovo rigo introdotto in questo datapack (§4.5);
  • N2 — seconda voce sullo stesso rigo (vedi neumaRk_voices.md).

I token N2 e N+ restano larghi 2 caratteri (la ) non compare), preservando l'invariante di allineamento verticale.

Analogamente, il marker C) ammette una variante:

  • C+ — riga di accordi alternativi sopra la riga base (neumaRk_chords.md §7; comment-label e scope di riga in §8).

Anche C+ resta largo 2 caratteri (la ) non compare), come N+, preservando la stessa invariante.

2.2 Inventario completo delle righe esplicite

La tabella di §2.1 elenca i marcatori usati dentro un datapack. Per completezza, questo è l'inventario di tutte le righe che il linguaggio riconosce per marcatore o per struttura (indipendentemente dalla deduzione implicita di §3.bis, che si applica alle sole righe senza marcatore).

Marcatori di riga del datapack (dentro un datapack; ordine in §3):

Marcatore Tipo Rif.
M) Markers neumaRk_markers.md
C) / C+ Chords / accordi alternativi neumaRk_chords.md §7
$) Fingering (diteggiatura, corde, posizione ferma) neumaRk_fingering.md
A) Articulations neumaRk_articulations.md
N) / N+ / N2 Notes / nuovo rigo / voce 2 §4.5, neumaRk_voices.md
D) Dynamics neumaRk_dynamics.md
L) Lyrics neumaRk_lyrics.md
F) Format §4

Marcatori di blocco (fra i datapack, globali):

Marcatore Tipo Rif.
PLAY) Programma esecutivo imperativo neumaRk_play_and_form.md
FORM) Panoramica descrittiva della forma neumaRk_play_and_form.md
LYRICS) Testo cantato per sezione neumaRk_lyrics.md §8
FOOT) Definizioni note a piè di pagina neumaRk_footnotes.md
TEXT) Prosa posizionata nel flusso neumaRk_text_line.md
%%NAME … %%end Blocchi di versione/arrangiamento neumaRk_versions.md

Righe strutturali (non portano contenuto musicale, non sono deducibili):

Riga Ruolo Rif.
nrk:MAJOR.MINOR Riga di versione (riga 1; obbligatoria nel file scambiato) neumaRk_specification.md §8, neumaRk_header.md §2
H…) Marcatori d'intestazione (HT / HCM / … / HV) neumaRk_header.md
riga vuota Separatore strutturale (fine header / fra datapack) §3.bis.1
// … Commento (riga intera o trailing) §11
riga che inizia con -, poi solo - / spazi / % Margine verticale fra datapack; % = possibile page break (-%) §10

3. Ordine logico delle righe (deduzione implicita)

In assenza di marcatori espliciti, il tipo delle righe viene dedotto seguendo l’ordine logico:

  1. Markers (al massimo una riga, opzionale)
  2. Chords
  3. una riga base C) + fino a 2 righe alternative C+ (§3.bis.7, limite E127)
  4. una seconda riga base C) è errore E129
  5. Gruppi di note, ciascuno composto da:
  6. una riga di Fingering $) (opzionale, prima; solo esplicita, mai dedotta — vedi neumaRk_fingering.md)
  7. una riga di Articulations (opzionale)
  8. una riga di Notes (obbligatoria in assenza di chords)
  9. una riga di Dynamics (opzionale, dopo — vedi neumaRk_dynamics.md)
  10. una riga di Lyrics (opzionale, ultima)

Un datapack può contenere da 1 a 4 gruppi di note: ogni gruppo corrisponde a un rigo del sistema (vedi §4). 4. Format (al massimo una riga, opzionale, sempre finale)


3.bis Deduzione del tipo di riga (algoritmo normativo)

Il §3 dà l'ordine logico dei tipi; questa sezione ne formalizza l'algoritmo di deduzione: come, in assenza di marcatore esplicito, il tipo di una riga è determinato da contenuto + posizione. La regola qui scritta è normativa — è la lingua, non un dettaglio d'implementazione. Un marcatore esplicito (§2.1) vince sempre: l'algoritmo che segue si applica solo alle righe senza marcatore.

3.bis.1 Struttura del datapack

Solo il blocco Markers e il blocco accordi sono unici per datapack (condivisi dall'intero sistema, §4.1); tutto il resto è un gruppo di note ripetuto, una volta per (rigo × voce). Il blocco accordi è unico ma posizionabile: la sua posizione fra i gruppi di note determina il rigo sopra cui è reso (regola-cardine in §4.1).

datapack   ::= [Markers]?  Item{1..}  [Format]?

Item       ::= NoteGroup | ChordBlock       // ChordBlock al più UNA volta
NoteGroup  ::= [$]? [A]? N [D]? [L]?  ( [$]? [A]? N2 [D]? [L]? )?   // un rigo (voce 1 [+ voce 2])
ChordBlock ::= ( [A]? C+ ){0,2}  [A]?  C)    // banda accordi (base + fino a 2 alt.)
  • Markers: unico, sempre prima riga (§8), condiviso.
  • ChordBlock (banda accordi): unico per datapack e condiviso da tutti i righi (§4.1). Contiene una sola riga base C) e fino a 2 righe alternative C+ immediatamente sopra (§3.bis.7, limite E127); ciascuna riga può essere preceduta dalla propria A) che ne articola il ritmo-accordi (neumaRk_chords.md §4) — per questo A) è ammessa prima di C)/C+. Il blocco compare al più una volta: due righe base C) sono errore E129.
  • NoteGroup (un rigo): N obbligatoria, con $)/A)/D)/L) opzionali e un'eventuale voce 2 N2 (col proprio corredo, compresa una propria $)). Si ripete fino a 4 righi (§4); con la voce 2 si arriva a 8 blocchi-voce complessivi (§4.6). La voce 2 non è deducibile implicitamente — non esiste modo di distinguere dal solo contenuto "voce 2 dello stesso rigo" da "nuovo rigo": va sempre dichiarata col marcatore esplicito N2.
  • $) (diteggiatura): mai dedotta — la cascata di §3.bis.4 non produce mai il tipo Fingering; la riga esiste solo col marcatore esplicito $). Diteggia la prima riga di note sotto di sé (N)/N+/N2), con l'eventuale A) del gruppo in mezzo (neumaRk_fingering.md §2).
  • Format: unica, sempre finale (§9).

Chord-detection implicita = solo in testa. La deduzione implicita del tipo Chords resta head-only (§3.bis.4, guardia "testa aperta"): senza marcatore, una riga chord-shaped è letta come accordi solo prima della prima riga di note. Un ChordBlock collocato dopo le note (fra i righi o sotto l'ultimo) richiede il marcatore esplicito C) — che vince sempre la deduzione (§2.1) ed è reso nella posizione in cui è scritto (§4.1). Così la classificazione implicita resta invariata (nessun brano riclassificato, §3.bis.8) e l'ancoraggio si apre solo su richiesta esplicita.

3.bis.2 Modello di calcolo

La deduzione è un automa a passo singolo, per-datapack, che scorre le righe in ordine di sorgente mantenendo due elementi di stato:

  • il tipo dell'ultima riga — il tipo dell'ultima riga (init Empty);
  • il flag testa chiusa — false finché non compare la prima riga Notes del datapack, poi true per sempre. Marca il confine fra Testa e Gruppi.

I guard sul tipo dell'ultima riga sono la funzione di transizione dell'automa: codificano sia l'ordine dentro un gruppo, sia il loop-back che apre il gruppo successivo (rientro su A o su N). Il flag testa chiusa impedisce a Chords di ricomparire una volta entrati nei righi.

3.bis.3 Pre-filtro: righe decorative

Prima della cascata, una riga puramente decorativa — composta solo da segni di battuta semplici, :, forme compatte di ritornello (neumaRk_flow_and_repeats.md §6.1), punti, spazi e tab — viene saltata e non viene interpretata come contenuto musicale (resta strutturale, le sue decorazioni di battuta appartengono semanticamente alle altre righe). Eccezione: il rescue >/^ in §3.bis.6.

3.bis.4 Cascata di classificazione (precedenza normativa)

Sulle righe non-decorative senza marcatore, si applica una cascata first-match-wins. L'ordine è vincolante: i predicati di contenuto sono volutamente permissivi e non sovra-matchano solo grazie a (a) questo ordine e (b) la guardia di posizione. Il trittico che definisce ogni tipo è predicato + guardia + esclusioni.

Perimetro. Questa cascata classifica solo le righe senza marcatore che portano contenuto musicale, e produce esattamente i 6 tipi qui sotto. I marcatori espliciti (§2.1) e le righe strutturali — riga di versione, header, righe vuote, commenti, margini (§10) — sono determinati da marcatore o posizione, non da questa cascata: l'inventario completo è in §2.2.

# Tipo Predicato (contenuto) Guardia (posizione) Esclusioni
1 Markers solo […] / barline / spazi è la prima riga del datapack —
2 Chords ≥1 accordo valido (neumaRk_chords.md §3) + barline / . / % / comment-label / spazi — oppure soli % (TB1bis) testa aperta (non ancora chiusa) non slash-only (TB2); non rest-only r/! (TB1)
3 Articulations charset del vocabolario A) (neumaRk_articulations.md) tipo ultima riga ≠ Articulations non ^-only (TB3); non notes-line valida (TB4)
4 Dynamics charset dinamiche (< > c d f m p s z - . \| :) tipo ultima riga = Notes —
5 Lyrics word-char + . - _ ' \| : (il più permissivo) tipo ultima riga ∈ —
6 Notes default / sink qualsiasi —

Note sulle guardie:

  • Markers (riga 1): la deduzione implicita di Markers avviene solo sulla prima riga del datapack. Una riga markers-shaped più in basso non è Markers (un M) esplicito resta possibile ovunque la spec lo consenta).
  • Chords (riga 2): la guardia normativa per la deduzione implicita è testa aperta. Senza marcatore, una riga chord-shaped è letta come accordi solo prima della prima riga di note: per la sola deduzione implicita non esiste chord-row dopo una notes-row. La condizione vale però solo per la deduzione implicita: una C) esplicita (§2.1) è ammessa anche dopo le note e viene resa come banda accordi nella posizione in cui è scritta (§4.1). In ogni caso gli accordi restano unici e condivisi dal sistema (§4.1); il blocco accordi è unico per datapack (§3.bis.1) e una seconda riga base C) è errore E129.
  • Lyrics (riga 5): il predicato è il più permissivo (matcha quasi ogni testo). È intenzionale: la permissività è contenuta dalla guardia di posizione, e in ogni caso il tipo di default è Notes. Non si restringe (sarebbe non-monotòno e rischierebbe di cambiare la classificazione di brani esistenti).
  • Default Notes: la riga 6 è il sink — ogni riga che arriva in fondo alla cascata è una riga di note. È anche il meccanismo del loop-back: due N) consecutive (entrambe sink) sono due righi distinti. In forma implicita la seconda riga di note non arriva al sink: dopo una riga Notes una riga di parole e barre è Lyrics (riga 5), quindi c d e f | sotto N) c4 d e f | è una riga di testo. Per due righi si scrive il marcatore (N) o N+).

3.bis.5 Tiebreaker

Tre disambiguazioni risolvono casi in cui un predicato permissivo matcherebbe il tipo sbagliato:

  • TB1 — rest-only → Notes. Una riga composta solo da rest-token (r / !), barline, ., % e spazi appartiene allo stave (è una riga di note di sole pause), non a una chord-row vuota. Vale dopo Chords/Alt e dopo Articulations:
A7        ← Chords          | > .       ← Articulations
r         ← Notes (TB1)     r           ← Notes (TB1)

Regola unica — «rest-only forza Notes»: la riga è intercettata prima di Chords e Articulations, a prescindere dal tipo di riga precedente. Una guardia richiede un rest-token r/! o % reale, così | > | (anacrusi) resta gestito dal rescue (§3.bis.6).

! conta qui come token di una riga di note, ma non è una pausa: è la ripetizione della nota precedente (neumaRk_notes_and_durations.md §5). Una riga di soli ! senza una nota prima (! ! sotto C) A7) è quindi Notes e dà E018.

  • TB1bis — %-only senza chord-row → Chords. Una riga composta solo da % (più barline, ., spazi — nessun rest-token r/!) in testa aperta e in assenza di una chord-row reale nel datapack è una chord-row di sole ripetizioni di misura: ogni % ripete l'ultima misura-accordo (anche dal datapack precedente — il lookback dei measure-repeat è cross-datapack). È l'eccezione a TB1: i % senza rest-token non vengono forzati a Notes, ma cadono nel ramo Chords (che accetta già %).
| C7 | F7 |     ← Chords
| a b c | …     ← Notes (chiude la testa)

| % | % |       ← Chords (TB1bis): ripete C7, F7 dal datapack sopra
| d e f | …     ← Notes

Motivazione: «accordi che si ripetono mentre la melodia cambia» è il pattern di lead-sheet più comune. Due guardie tengono il caso stretto:

  1. niente rest-token — una riga con r/! resta sempre Notes (TB1): le pause sono inequivocabilmente note;
  2. nessuna chord-row reale già vista — se la testa ha già una chord-row con accordo reale, una riga %-only successiva resta Notes (è una notes-row di ripetizioni), perché la chord-row del datapack è già definita.

Escape-hatch per la lettura opposta (un secondo rigo di note di soli %): marcatore esplicito N+ / N). Nota: un datapack di soli % senza una misura-sorgente valida (né nel datapack né in quello precedente, cross-datapack) emette E300 (measure-repeat senza sorgente); dichiararlo con N) se l'intento è una notes-row standalone di ripetizioni.

  • TB2 — slash-only → Notes. Una riga di soli / standalone (più barline, ., spazi) è slash rhythm (neumaRk_notes_and_durations.md §10), mai una chord-row: / da solo è sintatticamente quasi-accordo ma semanticamente un evento di nota.
| / | / |     ← Notes (TB2)
  • TB3 — ^-only → Notes. Una riga di soli ^ (più | e spazi) è una riga di note con sole legature di valore (neumaRk_notes_and_durations.md §6), non Articulations.
| ^ |     ← Notes (TB3)
  • TB4 — notes-line valida → Notes. Una riga che è una notes-line valida ha priorità sulle Articulations, anche se cade interamente nel charset del vocabolario A). Necessario perché alcune lettere del vocabolario sono pure note-name/durate: in particolare g (compone gl glissato, §9) è anche la nota G, e le durate 1–4 stanno nel charset → g, g4, g g g verrebbero letti come articolazioni e rubati ad A).
A7        ← Chords
g         ← Notes (TB4), non Articulations

Predicato: ogni token (split su spazi; le barline |/: ai bordi sono spogliate) è un note-token valido secondo la grammatica canonica delle note (fonte unica, quindi niente divergenza), e almeno un token porta un pitch reale [a-g]/r. I token di sola articolazione (>, tr, -, o, gl, ~…) non matchano quella grammatica → la riga resta Articulations; una riga di placeholder senza pitch reale che contiene , (| . , ^ |) → resta Articulations. Una riga di soli . è invece decorativa e viene saltata (§3.bis.3), e una di soli ^ è Notes (TB3). Vale anche il rescue >/^/~ (§3.bis.6). Principio: in caso di ambiguità A)↔N), vince la nota.

3.bis.6 Rescue > / ^

Una riga che il pre-filtro (§3.bis.3) avrebbe scartato come decorativa — perché > è leggibile come anacrusi attaccata a una barline — ma che contiene > oppure ^ ed è interamente charset-articolazioni, viene recuperata come Articulations (qui > è un accento, non un'anacrusi):

| > |     ← Articulations (rescue): accento sul primo evento della misura

Il rescue è un ramo fuori cascata e produce sempre Articulations (le articolazioni possono aprire un gruppo in qualsiasi posizione); è soggetto allo stesso vincolo (tipo ultima riga ≠ Articulations) e all'esclusione ^-only (TB3).

Tipo di riga ≠ colorazione del > leading. Il rescue decide solo il tipo (Articulations); l'esempio | > | ha il > fra barline, non in testa, ed è un accento. Quando invece una riga A)/D)/L) allineata alla C/N porta un > leading nella colonna del levare, quel > è colorato come il segno del levare (rosso), non come accento — vedi neumaRk_notes_and_durations.md §7 (Colonna del levare nelle righe allineate). Sono due livelli distinti: classificazione di riga qui, semantica posizionale del > lì.

Prima riga del datapack. Il rescue presuppone un contesto a monte. In prima posizione (line_id == 0) una riga | > | è letta come Markers/anacrusi, non come accento: il pre-filtro Markers (cascata riga 1) ha precedenza e > è ambiguo fra accento e levare quando non c'è una riga di note sotto a disambiguarlo. È una scelta consapevole: in assenza di contesto la lettura anacrusi prevale.

3.bis.7 Post-pass: promozione AlternateChords

La classificazione di base assegna Chords a tutte le chord-row implicite. Una pass successiva rietichetta come AlternateChords (C+, accordi alternativi sopra la base) le chord-row consecutive che precedono l'ultima, solo se nessuna chord-row del datapack porta un marcatore esplicito (se l'utente ha scelto i marcatori, la sua scelta è rispettata). Limite: max 2 righe alternative per datapack (E127). Spec completa in neumaRk_chords.md §7.

3.bis.8 Derivazioni e vincolo

  • Il charset di classificazione delle articolazioni (riga 3) deriva dal vocabolario chiuso di neumaRk_articulations.md (fonte unica): la deduzione e il rendering non devono divergere.
  • Invariante: la classificazione riga→tipo definita qui è normativa; ogni implementazione conforme deve produrla esattamente.
  • Classificazione (TB1bis): la riga %-only senza rest-token in testa aperta e senza chord-row reale è una chord-row di ripetizioni di misura (§3.bis.5 TB1bis).
  • Classificazione (TB4): la riga che è una notes-line valida ma cade nel charset A) (tipicamente le righe di sola nota g: g, g4, g g g) è una notes-line — vince la nota (§3.bis.5 TB4).

4. Più righi per datapack (multi-stave)

Un datapack può rappresentare un sistema con più righi allineati (es. melodia + basso). Il numero di righi è dato dal numero di gruppi di note ($?A?ND?L?) presenti, fino a un massimo di 4.

Il numero di righi può variare da un datapack all’altro nello stesso brano: un datapack può contenere un solo rigo e quello successivo due o più, senza dichiarazioni preventive.

4.1 Elementi condivisi dal sistema

I seguenti elementi sono comuni a tutti i righi del datapack:

  • riga di Markers
  • blocco accordi (base C) + eventuali alternative C+)
  • segni di battuta e decoratori di misura (volte, cambio di metro/tonalità, $, @, DC, FINE, ecc.)
  • tonalità e metro del sistema

Le stanghette di misura attraversano verticalmente tutti i righi.

Regola-cardine — posizione del blocco accordi (àncora). Il blocco accordi resta una sola armonia condivisa dal sistema, ma è reso nella posizione verticale in cui è scritto rispetto ai righi di note. Sia k il numero di righi di note (N)) scritti prima del blocco accordi (N2 non conta: condivide il rigo del suo N) parent) e n il numero totale di righi del sistema:

Posizione nel sorgente Resa
blocco in testa (k = 0) banda accordi sopra il primo rigo (default)
blocco fra due righi (0 < k < n) banda accordi nell'interlinea, sopra il rigo k (lead-sheet a 2 righi, sigle fra melodia e basso)
blocco dopo l'ultimo rigo (k = n) banda accordi sotto l'ultimo rigo

La posizione non moltiplica né lega gli accordi a un rigo: cambia solo la resa verticale, non l'armonia. I Markers (lettere di sezione, volte) restano sempre in alto, indipendenti dall'àncora. Armonie indipendenti per rigo (una C) diversa per ogni N)) sono fuori dal modello: l'armonia del sistema è unica.

Binding delle A). Una A) articola sempre la riga immediatamente sottostante: dentro il blocco accordi ne articola il C+/C) che segue (ritmo-accordi, neumaRk_chords.md §4); sopra un N) articola quel rigo. Così l'A) di un accordo non "scivola" sul rigo di note sotto.

Una A) che non ha sotto di sé la sua riga — scritta sotto l'ultima N) del datapack, o seguita da un'altra A) — non articola niente: è ignorata e il parser lo segnala con W174 (non bloccante). Fa eccezione il datapack senza righe di note, dove l'A) si applica alle pause d'ufficio.

Esempio (lead-sheet a 2 righi, accordi fra melodia e basso — stile Sher):

N) c8 d e f | g a b c           // rigo 0 (melodia)
C) | CMA7 | DbMA7               // blocco accordi: k=1, n=2 → interlinea, sopra il basso
N) (@F) c,4 e g e | c e g e     // rigo 1 (basso)

4.2 Elementi indipendenti per rigo

Ogni gruppo ($?A?ND?L?) definisce un rigo indipendente con propri:

  • Notes (obbligatorie)
  • Fingering, Articulations, Dynamics, Lyrics (opzionali)
  • chiave dichiarata via direttiva inline (@…) come primo token della riga di Notes — vedi neumaRk_notes_and_durations.md §9. In assenza di direttiva, vale l’ultima chiave definita nel contesto (default: chiave di violino).
  • legature, travi e gruppi irregolari (tutti contenuti nel rigo)

4.3 Allineamento orizzontale

L’allineamento verticale fra righi è temporale: la misura n di un rigo sta sopra la misura n degli altri. Se un rigo (o una voce, neumaRk_voices.md) ha meno misure degli altri, le misure che gli mancano si completano con pause di battuta, senza diagnostici: N) c d e f | g a b c | sopra N+ c d e f | dà al secondo rigo una pausa nella seconda misura.

4.4 Esempio

C) | Gm6 |
N) | g | a | bb | a |
N) | (@F) g,4 bb8 d e4 d | g,4 bb8 d e4 d | g,4 bb8 d e4 d | g,4 bb8 d e4 d |

Sistema a 2 righi: il primo in chiave di violino (default), il secondo in chiave di basso. L’accordo Gm6 è comune al sistema.


4.5 Continuità degli stave fra datapack (N+)

Quando un brano ha più datapack, ogni rigo (stave) ha una identità persistente: il "primo rigo" di un datapack è lo stesso "primo rigo" del precedente — eredita pitch context, chiave in vigore, durCtx, e viene reso nella stessa posizione verticale.

L'identità di base è posizionale: la prima N) del datapack corrisponde alla prima N) del datapack precedente, la seconda alla seconda, e così via.

Per aggiungere un nuovo rigo in un datapack senza romperne l'identità con i precedenti, si usa il marker N+ al posto di N).

N+   <contenuto del rigo nuovo>

Il + sostituisce la ) (non la aggiunge): il prefisso resta a 2 caratteri come N), così l'allineamento verticale delle misure resta identico fra righi adiacenti.

Regole

  • N) = continuazione del prossimo rigo del datapack precedente (FIFO, in source order). Ne eredita il context (pitch, chiave, durata).
  • Un datapack senza righe di note (un M) da solo, un C) di soli accordi) non conta: il «datapack precedente» di una N) è l'ultimo che aveva righi. Le pause o le barre d'ufficio del datapack senza note stanno sul primo di quei righi, nella sua chiave.
  • N+ = nuovo rigo introdotto in questo datapack. Parte con context fresh (riferimento di orientamento dipende dalla chiave iniziale, vedi neumaRk_notes_and_durations.md §2.2).
  • L'ordine in source = ordine visuale top→bottom. Il marker N+ determina solo l'identità (nuovo vs. continuazione), non la posizione.
  • N+ nel primo datapack del brano è ammesso ma ridondante (in assenza di precedenti tutti i righi sono per forza nuovi); viene trattato come un normale N).
  • Limite invariato: max 4 righi totali per datapack (somma di N)
  • N+).

Errori

  • E122 — N) senza match: il datapack ha più N) di quanti righi avesse il precedente. Mancano N+ (o un N) di troppo).
  • W168 (non bloccante) — N+ ridichiarato: il datapack contiene almeno un N+ e resta qualche rigo del precedente senza continuazione N). Tipicamente N+ è stato ripetuto a ogni datapack invece di scriverlo solo dove il rigo nasce. N+ non consuma la coda FIFO: il rigo precedente resta orfano e la N) che segue si aggancia all'identità del rigo sopra, ereditandone chiave e riferimento d'ottava (sintomo tipico: le pause di un rigo in chiave di basso disegnate nelle posizioni del violino, sopra il pentagramma). Rimedio: N+ solo nel datapack che introduce il rigo, N) in tutti i successivi.

Esempio

Datapack 1 (intro a 2 righi, treble + bass):

M) [intro]
C) G7
N) |: <d b>2 <e c>4 | <f d>2 <e c>4 :|
N) (@F) g,4. d'8 e d | f4. d8 e d

Datapack 2 (Theme): aggiunge un terzo rigo in alto (melodia di voce), mantenendo treble e bass dell'intro al centro e in basso.

M) [Theme]
C) > | G7
N+ >  d8 | b'^ | b2 r8 d,
A) >    | . ! | . !
N) > |: <d b>2 <e c>4 | <f d>2 <e c>4 :|
N) > | g,4. d'8 e d   | f4. d8 e d

Mapping risultante (per l'engine, non visibile in source):

source row tipo identità
1 (N+) nuovo nuovo stave (top)
2 (N)) cont. = primo rigo intro (treble)
3 (N)) cont. = secondo rigo intro (bass)

Il context (last_pitch, chiave, durCtx) dei righi 2 e 3 del Theme viene dai righi 1 e 2 dell'intro; il rigo 1 del Theme parte fresh.

Casi non coperti

La sintassi N)/N+ esprime la situazione comune "aggiungo un rigo in cima/in mezzo/in fondo", ma non copre:

  • drop selettivo (datapack che mantiene il 2° rigo del precedente ma droppa il 1°);
  • reorder (scambiare l'ordine visuale di righi esistenti, mantenendone l'identità).

Per questi casi una futura estensione potrebbe introdurre un riferimento esplicito all'ID interno del rigo (es. N<n>)). Non spec'd in questa versione.


4.6 Seconda voce per rigo (N2)

Ogni rigo può ospitare una seconda voce indipendente, introdotta dalla riga N2. Stave e voce sono concetti distinti: il rigo è il pentagramma, la voce è uno stream musicale all'interno del rigo.

La voce 2 condivide chiave, tonalità, metro, stanghette e riga degli accordi con la voce 1, ma mantiene contesto musicale persistente indipendente. Voce 1 ha gambi in alto, voce 2 in basso.

La specifica completa di sintassi, contesto, binding e diagnostica è in neumaRk_voices.md.


5. Regole di validità del datapack

Un datapack è valido se:

  • contiene almeno una riga di Notes o una riga di Chords
  • rispetta l’ordine logico delle righe
  • tutte le righe musicali sono temporalmente allineabili

Non è valido:

  • un datapack con sole righe di testo

Una riga di Format fuori posto o duplicata non invalida il datapack: si corregge con W182 (§9).


6. Segni di battuta e misure

Tutte le righe musicali (Markers, Chords, Articulations, Notes, Dynamics, Lyrics):

  • contengono segni di battuta — semplici e composti — ed eventuali decoratori di misura (in assenza di barline tutto il contenuto apparterrà alla prima misura del rigo)
  • definiscono implicitamente la suddivisione in misure

La riga di Format è l'unica eccezione: non ammette segni di battuta (né semplici né composti) e nessun decoratore di misura (§9).

La prima stanghetta. La stanghetta d'apertura di una riga è facoltativa quando prima di essa ci sono solo l'identificatore di riga e oggetti di contesto (§7.3: metro, tonalità, chiave, armonia in vigore, riferimento d'altezza, anche in un gruppo misto). Il contesto non crea una misura: vale per la misura che segue, come se fosse incollato alla barra d'ingresso. Qualunque altra cosa — una label, una nota, una sigla, un testo — fa del segmento una misura, e la stanghetta che lo chiude è una stanghetta vera.

C) (Bb) | Eb7 F |        // una misura in Sib: (Bb) è la tonalità
N) | g2 a |

C) [Intro] | Eb7 F |     // due misure: la prima porta solo la label
N) | r1 | g2 a |

N) (3/4) | c d e |       // una misura di 3/4, come N) |(3/4) c d e |

6.1 Segni di battuta supportati

I segni di battuta ammessi sono:

  • | battuta semplice
  • || doppia barra
  • |. o .| fine
  • |: inizio ripetizione
  • :| fine ripetizione

Il segno finale di battuta si scrive preceduto da uno spazio (c d e f |); la forma incollata c d e f| è tollerata e letta allo stesso modo.

6.2 Quel che sta fra virgolette è testo

Un | fra virgolette "…" non è un segno di battuta, e un > fra virgolette non è un'anacrusi: sono caratteri del testo. Vale per ogni contenitore quotato — comment-label di accordo, annotazione di nota, etichetta di M)/A)/D) — così una label può contenere quei segni senza spezzare la misura:

C) | C-7"a | b" | F7 |        // due misure, la sigla tiene la sua etichetta
M) | "a > b" |                // una misura, nessuna anacrusi

Condizioni, identiche a quelle dei commenti (§11):

  • \" è una virgoletta letterale e non delimita;
  • una virgoletta non chiusa non protegge nulla: una quote spaiata non deve mangiarsi le barre fino a fine riga;
  • eccezione: nelle righe cantate L) e nei blocchi LYRICS) le virgolette sono caratteri della parola, quindi lì non proteggono e un | divide la misura come sempre.

7. Decoratori di misura

I decoratori di misura sono elementi adiacenti a una barline e si dividono in:

  • BEGIN decorators (a destra della barline)
  • END decorators (a sinistra della barline)

7.1 BEGIN decorators

Posizionati immediatamente a destra della barline.

Possibili decoratori:

  • Oggetto di contesto di misura — vedi §7.3. Fra parentesi tonde, dichiara metro, tonalità, chiave, armonia in vigore e riferimento d'altezza:
|(3/4,Dm)
|([3+3+2]/8)
|(@F)
|(3/4,Ab,@F)
  • Volta endings

  • testo fra parentesi quadre

  • opzionale +n per la durata in misure

Esempio:

|[1.]+4

In assenza di +n, la volta si chiude automaticamente al primo :| incontrato entro 4 battute (caso tipico dei finali [1.]). Se nelle 4 battute successive non compare un :|, la volta indica un'uscita — usare +n per i casi non standard.

  • $ segno
  • @ coda

L'ordine dentro il gruppo BEGIN è libero: |(3/4)[1] e |[1](3/4) sono equivalenti. La forma canonica — quella che la serializzazione riemette — è |[1](3/4): il flusso tocca la barra, il contesto tocca la musica.


7.2 END decorators

Posizionati immediatamente a sinistra della barline.

Decoratori supportati:

  • DC
  • DCal@
  • DCalFINE
  • D$
  • D$al@
  • D$alFINE
  • FINE
  • al@
  • testo libero fra parentesi quadre (annotazione grafica)

I segni $ e @ sono BEGIN decorator (vedi §7.1): identificano il punto in cui il segno o la coda si trova, non un salto verso di essi.


7.3 Oggetto di contesto di misura

Il contesto che "corre" fra le misure — metro, tonalità, chiave in vigore, armonia che permane, riferimento d'altezza e durata corrente — è scrivibile. Si dichiara con un gruppo fra parentesi tonde ai confini di misura.

C) A7 |[1](@F7) !(2.) | G7 (@D7):open|
N) a  |[1](3/4,F,@F,f@4_8) b c d | g2. (5/4,D,@G,d@2_2):open|

(:open| è la fine di ritornello «aperta», neumaRk_flow_and_repeats.md §6.1.)

Componenti

@ significa imposta; il contenuto lo interpreta la riga su cui è scritto.

forma significato livello
3/4, [3+3+2]/8 metro (forme ammesse in neumaRk_header.md §10.4) misura (condiviso fra le righe)
Ab, Dm, X tonalità misura (condiviso fra le righe)
@F, @G8vb, @C3 su riga N) chiave rigo
@F13, @NC su riga C) armonia in vigore rigo (blocco accordi)
f@4_8 su riga N) riferimento d'altezza + durata rigo

Separatori: virgola, spazio o entrambi. I componenti hanno ordine arbitrario; il canonico è quello della tabella (metro, tonalità, chiave, riferimento), ed è quello che la serializzazione riemette.

f@4_8 non è sintassi nuova: è l'ottava assoluta di neumaRk_notes_and_durations.md §2.3 (@<n>_ + durata obbligatoria), usata qui come riferimento invece che come nota. Fissa altezza e durata per la musica che segue, senza scrivere nessuna nota.

Sulla riga C) una chiave non è ammessa (la chiave appartiene al rigo, e il rigo lo dichiara la N)): lì @ significa sempre armonia. Per questo (@F), (@G) e (@C) su C) sono sigle (Fa, Sol, Do maggiore), senza diagnostici; una forma che può essere solo una chiave ((@F8vb), (@G8va), (@G8vb), (@F8)) dà E135; (@C3) o (@F4) sono lette come sigle con un suffisso sconosciuto (W103, neumaRk_chords.md). Il riferimento d'altezza f@4_8 appartiene al rigo e si scrive sulla N): non è un componente della riga accordi. Su C) e C+, incollato alla barra o prima della prima stanghetta, dà E135 (E135.pitch_ref_on_secondary_row) come sulle altre righe che non portano il rigo (sotto).

Sempre sulla C) decide la posizione, perché lo slot delle parentesi dentro la misura è già occupato dall'accordo facoltativo (F13) e dal ritmo accordale, e una tonalità nuda sarebbe indistinguibile da una sigla:

  • un gruppo incollato alla barra (C) |(Bb) Eb7) o scritto prima della prima stanghetta (C) (Bb) | Eb7, §6) è contesto: (Bb) è la tonalità;
  • un gruppo staccato dopo la barra o dentro la misura (C) | (Bb) Eb7, C) | Eb7 (Bb) F) è un accordo facoltativo;
  • un metro staccato a un confine di misura è contesto anche sulla C) (C) | (3/4) G |, C) | G (3/4) | G |): una sigla non ha la forma di un metro.
C) |(Bb) Eb7 F | (Bb) Eb7 F |    // 1ª misura: tonalità Sib; 2ª: accordo facoltativo Bb
N) | g2 a | g2 a |

X come tonalità di contesto vale «nessuna armatura», come C.

Posizione

Solo ai confini di misura. La barra può essere esplicita o implicita: N) (@F) >g8 | … è valido — è il confine d'ingresso della prima misura di una riga che non apre con |.

Il segmento prima della prima stanghetta di una riga diventa una misura solo se contiene qualcosa che non è contesto (§6): N) | a fa una misura sola, e così N) (@F) | a — il (@F) è il contesto d'ingresso della misura di a, esattamente come in N) |(@F) a o N) (@F) a. In questa posizione il gruppo (o la sequenza di gruppi) si legge come incollato alla barra d'ingresso, con lo stesso vocabolario, su ogni riga di misura (N), N2, N+, C), C+, M), A), D), L), $)). Sulla riga C) (Bb) | Eb7 F | è quindi una misura in Sib e (@F13) | G una misura con l'armonia dichiarata, mentre (F13) | G — accordo facoltativo, cioè musica — resta di due misure. Una label rende vera la stanghetta: C) [Intro] | Eb7 F | ha due misure, la prima con la sola label.

Posizione libera. Un gruppo staccato a un confine di misura, in una misura senza note (le righe M), A), D), L), $), o una misura di C)), segue la regola d'adiacenza qui sotto: prima del contenuto è d'ingresso, dopo è d'uscita e vale dalla misura seguente. Una label conta come contenuto: M) (3/4) [Intro] | porta il 3/4 nella misura della label, M) [Intro] (3/4) | dalla misura dopo. Sulle righe M), A), D), L), $) in posizione libera è contesto solo il metro: una tonalità o un riferimento d'altezza staccati non sono contesto e la riga li legge con la propria grammatica (in L) | la (E) | (E) è una sillaba). La grammatica della M) non ha posto per loro (neumaRk_markers.md §7): M) | (Bb) | dà W186 (W186.key_free_position) e il gruppo si scarta; per cambiare tonalità lo si incolla alla barra, M) |(Bb) |.

Righe che non portano il rigo. La chiave e il riferimento d'altezza appartengono al rigo e si scrivono sulla N) (la chiave non sulla N2, neumaRk_voices.md). Su M), A), D), L) e $), incollati alla barra o prima della prima stanghetta, anche in un gruppo misto, danno E135 (E135.clef_on_secondary_row, E135.pitch_ref_on_secondary_row): il componente si scarta e il rigo N) resta com'era; gli altri componenti del gruppo valgono (A) |(3/4,c@3_8) . dichiara il 3/4). Il riferimento d'altezza dà lo stesso E135 anche su C) e C+, con la riga accordi sopra o sotto la N) (C) |(3/4,c@3_8) G . . | dichiara il 3/4, le note della N) non cambiano). Metro e tonalità sono della misura e si possono scrivere su ogni riga.

Regola di adiacenza, una frase: il contesto tocca la musica, il flusso tocca la barra.

  • ingresso (musica a destra): |[1](3/4,@F) c4
  • uscita (musica a sinistra): d (@G,a@4_2):open|

Lo spazio sta solo sul lato musica, ed è obbligatorio: incollata a una nota, la parentesi è decorazione di nota (testa, glissato, ritmo accordale). Un gruppo solo, in una misura senza musica, è una dichiarazione d'ingresso: non ha musica alla sua sinistra da toccare.

A metà misura è ammesso solo il cambio di chiave ((@F)): non è contesto di misura, è un evento notazionale che cade su una nota. Gli altri componenti fuori da un confine di misura sono rifiutati → E136.

Un metro non valido ((1/1), (5/3), (0/4), (3/32): il denominatore deve essere 2, 4, 8 o 16 e il numeratore almeno 1) è rifiutato con E136 (E136.context_meter_invalid): il componente si scarta e resta il metro precedente. In un gruppo con più componenti gli altri valgono ((3/4,1/1) vale 3/4). Lo stesso criterio vale per il metro dell'header (neumaRk_header.md §10.4, E303).

Il decoratore può essere adiacente anche a una barra d'anacrusi > (oltre che a |): >(@F), >(3/4,Ab,@F). Il >( … ) glued si disambigua dall'anacrusi di ritornello (reprise-pickup, neumaRk_notes_and_durations.md §7.2) dal primo carattere dopo >(: avvio-di-contesto (@, cifra, [, maiuscola A–G) → oggetto di contesto; nota minuscola / r / s → reprise-pickup. (Le tonalità usano la maiuscola, le note del pickup la minuscola: nessuna collisione.)

Semantica

  • I componenti a livello misura (metro, tonalità) restano condivisi fra le righe del datapack: vale la regola "la prima riga che scrive vince". Se una riga successiva dichiara per la stessa misura un metro o una tonalità diversi, il suo valore si ignora con W159 (W159.context_conflict per il metro, W159.context_key_conflict per la tonalità), e il documento riscritto le assegna il valore della prima riga: C) |(3/4) G . . | sopra N) |(2/4) a4 b | dà una misura di 3/4. La stessa regola vale per i decoratori di flusso divergenti fra due righe della stessa misura (segno, coda, salti: W159, vince la riga scritta prima; neumaRk_markers.md §2.1).
  • I componenti a livello rigo (chiave, armonia, riferimento) appartengono alla riga su cui sono scritti: N+ e N) dello stesso datapack dichiarano ciascuno il proprio riferimento, senza conflitto.
  • Un componente non produce di per sé nessun segno. Metro, tonalità e chiave si disegnano perché cambiano qualcosa che il lettore deve vedere; riferimento e armonia non hanno niente da mostrare. La chiave si stampa prima della musica che la consuma; se il cambio cade sul cambio di rigo, a inizio del rigo nuovo — e, se l'annuncio di cortesia è attivo, anche alla fine del rigo precedente (preferenza di resa del renderer: dove si scrive l'oggetto non cambia nulla). Solo la chiave iniziale del rigo fissa il riferimento d'ottava (§9 di neumaRk_notes_and_durations.md); i cambi successivi sono solo grafici.
  • L'oggetto non conta una posizione per l'allineamento di A) e D): aggiungerlo non sposta le articolazioni della misura (come lo slash /, che vale una posizione sola).
  • Doppio annuncio sullo stesso istante (…(5/4,D)|(3/4,F)…, anche attraverso una doppia barra (5/4,D)||(3/4,F)): W169, vince l'ingresso — è il più vicino alla musica che ne subisce l'effetto. Due barre separate da uno spazio ((5/4,D)| |(3/4,F)) racchiudono invece una misura vuota: sono due istanti diversi, nessun avviso.
  • Un contesto d'uscita sull'ultima misura del brano non ha musica a cui applicarsi: non ha effetto, e il documento riscritto non lo conserva.

Riga e datapack di solo contesto

Una misura vuota con una dichiarazione resta una misura: N) c d e f | (@F) | c d e f | ha tre misure, esattamente come N) c d e f | | c d e f |. Il cambio di chiave si stampa all'inizio della seconda, sopra la sua pausa di battuta.

L'unità che può non stamparsi è la riga:

  • una riga il cui contenuto è fatto soltanto di oggetti di contesto (N) (@F) |) non si stampa;
  • un datapack le cui righe sono tutte così non occupa spazio nella partitura: nessun pentagramma, nessuna pausa d'ufficio, nessun numero di battuta, nessuna durata nel flusso. Ciò che dichiara vale per la musica che segue, e lì si disegna (la chiave, il metro, la tonalità);
  • in un datapack che invece si stampa, un rigo (N)/N+) di solo contesto non compare in quel sistema, in qualunque posizione — N) c d e f | sopra N+ (@F) | dà un sistema a un rigo solo, e il secondo rigo compare dal datapack in cui ha musica; lo stesso con N) (@G) | sopra N) (@F) c e g e |. Le sigle e le indicazioni degli altri righi restano ai loro righi. Se togliendo i righi di solo contesto non ne resterebbe nessuno (un M) [A] sopra N) (@F) |), si stampano normalmente.

È il modo di dichiarare un contesto senza scrivere musica: in un punto preciso del brano, o dentro un blocco %%NAME che potrebbe non essere reso.

Un datapack di solo contesto che non dichiara righi (C) |(@F13) | da solo) non interrompe nemmeno la continuità dei righi: la N) del datapack dopo continua quelli di prima.

Un segno di flusso (ritornello, volta, decoratore), un marker, un'armonia scritta fanno esistere il sistema anche senza note: un datapack che li porta si stampa.


8. Riga di Markers

La riga di Markers:

  • contiene marcatori racchiusi fra parentesi quadre
  • i marker si riferiscono all’inizio della battuta

Se un marker è preceduto da una barline:

  • deve esserci uno spazio fra barline e marker
  • per evitare ambiguità con i volta-decorators: |[A] incollato è letto come volta con l'etichetta A, non come sezione

È best practice collocare i decoratori di flusso (DC, D$, coda, ecc.) in questa riga.


9. Riga di Format

La riga di Format si dichiara sempre col marcatore esplicito F): non esiste una forma implicita, e una riga di soli segni d'allineamento senza F) (|*|) è una riga di note (non valida).

La riga di Format, se presente, deve essere:

  • unica per datapack;
  • sempre l’ultima riga del datapack;
  • composta da un segno d'allineamento, con l'eventuale contenuto a lato (§9.1) prima e/o dopo.

Contiene indicazioni di allineamento:

Simbolo Allineamento
\|* LEFT
*\| RIGHT
\|*\| CENTER
\|**\| JUSTIFIED (default)

Il segno conta solo come token intero, separato da spazi o dal bordo della riga: [A|8], **x**| o \|* non sono segni. Se la riga ne porta più d'uno, vale il primo.

9.1 Contenuto a lato del sistema

Un sistema allineato a sinistra, a destra o al centro lascia spazio libero. La riga F) può riempirlo: il contenuto sta dalla parte del segno in cui lo si scrive.

F) |* On cue, D.S. al @              // sistema a sinistra, testo a destra
F) Dal $ al @ poi [Coda]&fermata *|  // testo a sinistra, sistema a destra
F) Solo: |*| [B]x2                   // centrato, contenuto su entrambi i lati

Il contenuto di ciascun lato è un corpo FORM) (neumaRk_play_and_form.md §3–§6), senza virgolette attorno: prosa markup-aware, box di sezione con le loro label e i loro postfix, i token $ @ &fermata, ; per andare a capo, richiami footnote [^…] e link [testo=>url]. Come in FORM) niente viene eseguito: un $ o un @ scritto qui non è un segno di flow, e un box che non corrisponde a una sezione di M) si disegna come riferimento non risolto, senza diagnostici. Per scrivere un segno d'allineamento come testo si antepone \ (\|*). Un // apre il commento di coda, come su ogni riga (§11).

Il contenuto si dispone nello spazio libero, a distanza fissa dal sistema, e centrato in verticale sui righi del sistema. Se su una riga non ci sta, il sistema si stringe (fino a un quinto della sua larghezza, mai sotto lo spazio minimo delle sue misure) e poi il contenuto va a capo.

Lo spazio libero dipende dall'allineamento: a destra con |*, a sinistra con *|, da entrambi i lati con |*|; con |**| non ce n'è.

9.2 Diagnostici

Una riga F) che viola queste regole emette W182 e viene corretta:

  • non è l'ultima: è spostata in fondo (W182.not_last);
  • ce n'è più d'una: vale l'ultima (W182.duplicate);
  • non porta nessun segno come token intero, oppure ne porta più d'uno: la riga si ignora, o dal secondo segno in poi (W182.extra_content);
  • porta contenuto dalla parte occupata dal sistema (F) testo |*, F) *| testo) o con |**|: quel contenuto si ignora e l'allineamento resta (W182.no_room).

I box del contenuto a lato hanno gli stessi diagnostici di FORM) (W141, W142, W143, E302).


10. Margini fra datapack

Una riga:

  • che segue una riga vuota
  • che inizia con -
  • che contiene solo -, spazi, tab o %

indica un margine verticale fra datapack.

La profondità del margine è data dal massimo numero di - consecutivi:

  • - - - → margine 1
  • - -- - → margine 2
  • --- - → margine 3

Il simbolo % indica un possibile page break.

Una riga di soli %, senza - iniziale, non è un margine: è una riga di accordi di sole ripetizioni di misura (§3.bis.5, TB1bis). Il page break si scrive -%.

11. Commenti

Sono permessi commenti single-line nella forma // comment. Lo scope è la riga: tutto ciò che segue // fino al newline viene ignorato dal parser, salvo le due eccezioni qui sotto. I commenti possono stare su riga propria (sopra/sotto un datapack, o tra le righe di un datapack) oppure a fine riga di qualunque riga di codice, comprese le righe di intestazione dei blocchi a testo libero (TEXT), INFO), PLAY), FORM), LYRICS), FOOT)).

Il discriminante fra le due forme è posizionale: se prima di // c'è almeno un carattere non-whitespace, il commento è trailing (la parte di codice prima di // resta valida); altrimenti l'intera riga è commento.

Due contesti proteggono il //, cioè lo rendono testo invece che inizio di commento:

  1. Dentro un link [testo=>url] — anche nella forma escapata \[testo=>url] — il // fa parte dell'indirizzo (https://…, vedi neumaRk_text_markup.md §3quater). Un // dopo la ] di chiusura torna a essere un commento.
  2. Fra virgolette "…" — comment-label di accordo, annotazione di nota, etichetta di M)/A)/D), etichetta e corpo di INFO): quel che sta fra virgolette è testo, come già vale per le barre di misura (§6.2: un | fra virgolette non divide una misura). \" è una virgoletta letterale e non delimita, e una virgoletta non chiusa non protegge nulla (una quote spaiata non si mangia il commento fino a fine riga). Eccezione: nelle righe cantate L) e dentro i blocchi LYRICS) le virgolette sono caratteri della parola, quindi lì non proteggono e il // apre un commento.

Il commento è conservato dove è scritto: né la posizione né la forma cambiano quando il documento viene riscritto (cambio di formato, neumaRk_formats.md, o riscrittura da parte di un editor). Un commento su riga propria dentro un blocco a testo libero resta dentro il blocco, alla sua riga.

I commenti multi-riga (/* … */) non sono supportati: NRK è un linguaggio column-sensitive (le | di battuta allineano verticalmente le righe del datapack) e i block comments romperebbero l'allineamento.

La sequenza %% ad inizio riga non è un commento: è riservata per i blocchi di versione del brano (vedi neumaRk_versions.md).

11.1 INFO) — commento destinato al lettore

// commento vive solo nel sorgente. INFO) è il suo gemello di secondo livello: porta testo destinato al lettore ma non all'incisione.

INFO) "Nota del trascrittore" Trascritto dal disco del 1961;
le sigle seguono il lead sheet originale.

Il corpo non fa parte della partitura: non è disegnato fra i segni e non entra in alcuna esportazione (PDF, MusicXML, LilyPond). Una resa interattiva può renderlo disponibile su richiesta nel punto a cui è ancorato; una resa statica lo omette. Il testo non ha valore musicale: nessun costrutto lo referenzia, nessuna esecuzione lo legge. Viaggia però sempre col documento: ogni file .nrk salvato, esportato o condiviso lo conserva.

Resa di riferimento (informativa). Quando c'è un corpo, la resa interattiva mette dopo l'etichetta (o da sola, se l'etichetta manca) una piccola icona ⓘ che lo apre; un'etichetta senza corpo non ha icona. Le esportazioni statiche (PDF) tolgono l'icona e tengono l'etichetta.

Forma. Marcatore a inizio riga, la prosa può cominciare sulla stessa riga o sotto. Le righe successive sono continuazione, prosa markup-aware (neumaRk_text_markup.md). Il blocco finisce alla prima delle tre cose di §13: un marcatore di riga non escapato, una riga vuota, la fine del documento.

Etichetta. Subito dopo INFO) può stare un container "…", che deve chiudersi sulla stessa riga: è un'etichetta incisa, cioè partitura a tutti gli effetti — stampata, esportata, dentro il fit e la paginazione. Quel che segue la virgoletta di chiusura è già corpo; le due forme

INFO) "Studio version"
La versione in studio prevede …
INFO) "Studio version" La versione in studio prevede …

sono equivalenti. Un corpo che deve cominciare con una virgoletta la scrive escapata (\", neumaRk_text_markup.md §4). L'etichetta senza corpo è un uso legittimo: una didascalia breve, senza nulla da aprire.

Ancoraggio: la posizione nel sorgente. Non esistono etichette di richiamo: dove scrivi INFO) decide a cosa si riferisce.

Dove sta INFO) Ancoraggio
fra le righe dell'intestazione (H…)), senza riga vuota in mezzo l'intestazione
prima delle righe musicali di un datapack la testa del datapack
dopo le righe musicali di un datapack la coda del datapack
da sola, fra due righe vuote autonomo, nel punto in cui sta
in testa a un blocco %%NAME il blocco di versione (neumaRk_versions.md §2.4.3)

La riga vuota chiude INFO) proprio perché è lì che l'autore dice a cosa si riferisce: staccata dalla musica che segue è autonoma, attaccata ne è la testa. Il corpo è prosa: va a capo con l'a-capo del sorgente, e il ; vi è un carattere letterale (neumaRk_text_markup.md §3bis).

Uno per ancoraggio: al più un INFO) nell'intestazione, uno in testa e uno in coda a ciascun datapack; due blocchi autonomi separati da una riga vuota sono due ancoraggi distinti. Il secondo INFO) sullo stesso ancoraggio è ignorato (W170, vince il primo). Un blocco senza etichetta né corpo è ignorato (W171). Un'etichetta non chiusa sulla stessa riga non è un'etichetta: la riga è letta come corpo (W172). Un INFO) in mezzo alle righe musicali di un datapack è un errore (E137): va scritto prima della prima riga o dopo l'ultima.

Quando usare quale: un'istruzione sulla musica è un'annotazione di M); della prosa impaginata è TEXT); dire che cosa si sta leggendo e perché è INFO). Da non confondere con una descrizione che l'host tiene sul brano: quella è organizzazione dell'host, INFO) è contenuto del brano e lo segue ovunque.


12. Blocchi di versione

Fra un datapack e l'altro possono comparire blocchi di versione, marcati %%NAME … %%end, che racchiudono uno o più datapack alternativi del brano. I blocchi vivono standalone fra datapack, non al loro interno. Vedi neumaRk_versions.md per la spec completa.


13. Fine dei blocchi a testo libero

I blocchi a testo libero — PLAY), FORM), LYRICS), FOOT), TEXT), INFO) — proseguono sulle righe successive alla riga che li apre. Per tutti vale una sola regola di fine, definita qui e richiamata dalle rispettive specifiche:

Un blocco a testo libero finisce al primo marcatore di riga esplicito non escapato, oppure a fine documento.

13.1 Marcatore di riga

È marcatore di riga una riga che, dopo gli spazi iniziali, non comincia con \ e comincia con uno fra:

Famiglia Marcatori
righe del datapack M) C) N) A) D) L) F)
varianti a 2 caratteri C+ N+ N2, seguiti da uno spazio o dalla fine della riga
marcatori di blocco PLAY) FORM) LYRICS) FOOT) TEXT) INFO)
versioni %%
righe d'intestazione H…) (HT) HC) … HV), neumaRk_header.md)

Una riga di commento (// …) non è un marcatore di riga: non chiude il blocco, ed è conservata dentro il blocco, alla riga in cui è scritta (§11).

Sono le righe degli inventari di §2.2. Una marker-row implicita (una riga come [Intro], senza M)) non chiude un blocco: dentro PLAY), FORM) e LYRICS) [NOME] da solo su una riga è contenuto (un box di sezione, una entry in forma estesa), e dentro TEXT) è prosa. Per chiudere un blocco davanti a una riga di marker si scrive il marcatore esplicito:

TEXT) prosa informativa
M) [Intro]
C) | Cm11 |
N) | c,4 g' c r |

Vale anche per INFO): sotto un INFO) la riga di marker si scrive esplicita, M) [Intro], altrimenti [Intro] è assorbita come corpo dell'informazione.

N2O o C++ all'inizio di una riga di prosa non sono marcatori: le varianti a 2 caratteri lo sono solo se seguite da uno spazio o dalla fine della riga.

13.2 Escape a inizio riga

Un \ a inizio riga rende letterale il marcatore che segue: la riga non è un marcatore e appartiene al blocco.

TEXT) La ripresa si suona
\N) come prima, ma piano.
  • Alla resa il \ iniziale si toglie: la riga si legge «N) come prima, ma piano.».
  • Il sorgente lo conserva: al round-trip la riga è riemessa con il \.
  • Se il carattere dopo \ è un metacarattere del markup (\[, \*, \#, …), vale l'escape del markup (neumaRk_text_markup.md §4): il risultato a video è lo stesso, il carattere si legge letterale.

13.3 La riga vuota

La riga vuota chiude La riga vuota non chiude
PLAY) FORM) FOOT) INFO) TEXT) LYRICS)

La riga vuota non chiude dove è contenuto: in TEXT) e LYRICS) separa paragrafi o strofe ed è spazio verticale stampato. Chiude ovunque altro, perché lì è il separatore fra datapack (§1).


14. Diagnostici

Codice Condizione
E110 Più di 4 righi nel datapack (§4)
E122 N) senza un rigo da continuare nel datapack precedente: serve N+ (§4.5)
E127 Più di 2 righe alternative C+ (§3.bis.7)
E129 Più di una riga base C) (§3.bis.1)
E135 Chiave su una riga C) (E135.clef_on_chord_row), chiave (E135.clef_on_secondary_row) su M)/A)/D)/L)/$), riferimento d'altezza (E135.pitch_ref_on_secondary_row) su M)/A)/D)/L)/$)/C)/C+: componente scartato (§7.3)
E136 Componente dell'oggetto di contesto non riconosciuto, fuori da un confine di misura, o metro non valido (E136.context_meter_invalid) (§7.3)
E137 INFO) in mezzo alle righe musicali di un datapack (§11.1)
E300 Ripetizione di misura % senza sorgente (§3.bis.5, TB1bis)
W159 Metro, tonalità o decoratori di flusso diversi fra righe della stessa misura: vince la prima riga (§7.3)
W168 N+ ridichiarato: un rigo del datapack precedente resta senza continuazione (§4.5)
W169 Contesto annunciato due volte nello stesso istante (§7.3)
W170 Secondo INFO) sullo stesso ancoraggio (§11.1)
W171 INFO) vuoto (§11.1)
W172 Etichetta di INFO) non chiusa sulla stessa riga (§11.1)
W174 Riga A) senza la sua riga sotto: ignorata (§4.1)
W182 Riga F) non finale, duplicata, senza segno o con contenuto dove non c'è spazio (§9.2)
W186 Tonalità staccata in posizione libera sulla riga M) (W186.key_free_position): scartata (§7.3, neumaRk_markers.md §7)