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 (vedineumaRk_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:
- Markers (al massimo una riga, opzionale)
- Chords
- una riga base
C)+ fino a 2 righe alternativeC+(§3.bis.7, limite E127) - una seconda riga base
C)è errore E129 - Gruppi di note, ciascuno composto da:
- una riga di Fingering
$)(opzionale, prima; solo esplicita, mai dedotta — vedineumaRk_fingering.md) - una riga di Articulations (opzionale)
- una riga di Notes (obbligatoria in assenza di chords)
- una riga di Dynamics (opzionale, dopo — vedi
neumaRk_dynamics.md) - 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 alternativeC+immediatamente sopra (§3.bis.7, limite E127); ciascuna riga può essere preceduta dalla propriaA)che ne articola il ritmo-accordi (neumaRk_chords.md §4) — per questoA)è ammessa prima diC)/C+. Il blocco compare al più una volta: due righe baseC)sono errore E129. - NoteGroup (un rigo):
Nobbligatoria, con$)/A)/D)/L)opzionali e un'eventuale voce 2N2(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 esplicitoN2. $)(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'eventualeA)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
ChordBlockcollocato dopo le note (fra i righi o sotto l'ultimo) richiede il marcatore esplicitoC)— 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 baseC)è 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), quindic d e f |sottoN) c4 d e f |è una riga di testo. Per due righi si scrive il marcatore (N)oN+).
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 (! !sottoC) A7) è quindi Notes e dà E018.
- TB1bis —
%-only senza chord-row → Chords. Una riga composta solo da%(più barline,., spazi — nessun rest-tokenr/!) 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:
- niente rest-token — una riga con
r/!resta sempre Notes (TB1): le pause sono inequivocabilmente note;- 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 esplicitoN+/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 conN)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 particolareg(componeglglissato, §9) è anche la nota G, e le durate1–4stanno nel charset →g,g4,g g gverrebbero 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 rigaA)/D)/L)allineata alla C/N porta un>leading nella colonna del levare, quel>è colorato come il segno del levare (rosso), non come accento — vedineumaRk_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 notag: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 alternativeC+) - 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 — vedineumaRk_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, unC)di soli accordi) non conta: il «datapack precedente» di unaN)è 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, vedineumaRk_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 normaleN).- 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. MancanoN+(o unN)di troppo). - W168 (non bloccante) —
N+ridichiarato: il datapack contiene almeno unN+e resta qualche rigo del precedente senza continuazioneN). TipicamenteN+è 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 laN)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 blocchiLYRICS)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
+nper 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:
DCDCal@DCalFINED$D$al@D$alFINEFINEal@- 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_conflictper il metro,W159.context_key_conflictper la tonalità), e il documento riscritto le assegna il valore della prima riga:C) |(3/4) G . . |sopraN) |(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+eN)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)eD): 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 |sopraN+ (@F) |dà un sistema a un rigo solo, e il secondo rigo compare dal datapack in cui ha musica; lo stesso conN) (@G) |sopraN) (@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 (unM) [A]sopraN) (@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'etichettaA, 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:
- Dentro un link
[testo=>url]— anche nella forma escapata\[testo=>url]— il//fa parte dell'indirizzo (https://…, vedineumaRk_text_markup.md§3quater). Un//dopo la]di chiusura torna a essere un commento. - Fra virgolette
"…"— comment-label di accordo, annotazione di nota, etichetta diM)/A)/D), etichetta e corpo diINFO): 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 cantateL)e dentro i blocchiLYRICS)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) |