Header¶
1. Definizione e ruolo dell’header¶
L’header è una sezione opzionale di un documento neumaRk, collocata all’inizio del file dopo la dichiarazione di versione.
Il suo scopo è contenere tutte le informazioni non strettamente musicali necessarie a:
- identificare il brano;
- contestualizzarlo (autore, stile, tempo, tonalità, ecc.);
- fornire indicazioni globali valide per l’intero documento.
In neumaRk l’header coincide integralmente con i metadati del file.
Non esistono metadati esterni, distribuiti o dichiarati altrove.
2. nrk:version e relazione con l’header¶
Ogni file neumaRk deve iniziare con una riga di versione nella forma:
nrk:
Esempio:
nrk:0.6
Caratteristiche:
- è obbligatoria nel file
.nrkscambiato (esportato, importato, condiviso) e nei blocchi-brano di una collezione, dove separa un brano dal successivo (neumaRk_collections.md§9.2); - deve essere la prima riga del file;
- non fa parte dell’header.
La regola vale al confine del file. Un brano può arrivare a un parser anche
senza la riga nrk:, quando la versione gli è nota per altra via (per esempio
dal contenitore che lo conserva): in quel caso il brano è valido e l'assenza non
produce diagnostici. Una riga nrk: presente ma malformata (non nella forma
nrk:<major>.<minor>, es. nrk:abc) è ignorata con W307.
Dopo la riga nrk:version possono comparire uno o più righi vuoti, seguiti da:
- un header, oppure
- direttamente dal primo datapack musicale.
3. Blocco di header e criterio di riconoscimento¶
3.1 Blocco iniziale¶
L’header, se presente, è costituito da un blocco di righe consecutive che:
- segue la riga
nrk:version(dopo eventuali righi vuoti); - precede qualsiasi datapack musicale;
- non contiene righe vuote.
L’header termina al primo rigo vuoto.
Il contenuto successivo è interpretato come datapack musicale.
3.2 Riconoscimento del blocco e campi non validi¶
Il blocco iniziale è un header se nessuna delle sue righe è interpretabile come riga musicale (note, accordi, markers). Se anche una sola riga lo è, l’intero blocco è un datapack musicale (§3.3).
Una volta riconosciuto, l’header vale campo per campo:
- un campo con un valore non valido (tonalità, metro, BPM, anno) si scarta con un diagnostico (§14); gli altri campi restano validi e il blocco resta header;
- un campo ripetuto (stesso marcatore due volte) vale per la prima occorrenza
valida; le successive si ignorano con W305. Fanno eccezione le righe
HT), che dopo la prima dichiarano titoli alternativi (§7.1); - nella forma implicita un token della riga di metadati che non è riconosciuto si ignora con W306 (§9.3);
- una riga con un marcatore
H…)sconosciuto si ignora con W308 (§6.1).
Un errore in un campo non fa quindi perdere gli altri: HK) H scarta la sola
tonalità (con E301) e titolo, tempo e metro dichiarati restano.
3.3 Principio di deduzione conservativa e anti-collisione¶
La deduzione implicita nell’header di neumaRk è governata da un principio fondamentale:
un elemento dell’header non deve mai poter essere confuso con un elemento musicale.
In particolare, una riga dell’header non deve collidere semanticamente con:
- una riga di note;
- una riga di accordi;
- una riga di markers;
- qualunque riga valida come datapack musicale.
Questo principio ha lo scopo di:
- evitare ambiguità strutturali;
- rendere il parsing affidabile;
- garantire che la deduzione non produca interpretazioni errate.
La deduzione è quindi conservativa:
- se una riga può essere interpretata sia come elemento di header sia come riga musicale, prevale l’interpretazione musicale;
- in tal caso, il parsing dell’header fallisce e il blocco viene trattato come datapack musicale.
La specifica non impone una grammatica formale completa per distinguere in modo assoluto header e contenuto musicale. Alcuni aspetti della deduzione possono dipendere da euristiche implementative, purché rispettino il principio di non-collisione e la strategia conservativa descritta.
Deduzione di style¶
Nella deduzione implicita dell’header, gli elementi testuali debolmente
tipizzati (come lo style) devono sempre evitare collisioni con elementi
strutturalmente più forti, quali Key, Meter e BPM.
4. Sintassi formale e sintassi informale¶
L’header supporta due modalità sintattiche: formale (esplicita) e informale (implicita).
4.1 Sintassi formale (esplicita)¶
Caratteristiche:
- uso di marcatori di riga espliciti;
- nessuna ambiguità sintattica;
- ordine delle righe arbitrario;
- ogni elemento occupa una riga dedicata.
È la modalità raccomandata per l’uso automatico.
4.2 Sintassi informale (implicita)¶
Caratteristiche:
- uso minimo o assente di marcatori;
- deduzione basata su contenuto e posizione;
- ordine delle righe vincolato;
- deduzione basata su regole conservative.
La sintassi informale privilegia la leggibilità e la scrittura rapida.
4.3 Precedenze¶
In caso di ambiguità o conflitto, prevale:
- la sintassi formale;
- le regole di posizione;
- la deduzione semantica;
- il fallimento del parsing dell’header.
5. Elementi ammessi nell’header¶
L’header riconosce esclusivamente i seguenti elementi:
- Titolo
- Credits
- Music by
- Lyrics by
- Arranger
- Transcriber
- Year
- Style
- Key
- Meter
- BPM
- Versions (solo forma esplicita
HV), vedi §10.6)
Tutti gli elementi sono opzionali. Un elemento con valore non valido si scarta con un diagnostico senza invalidare l’header (§3.2).
Titolo, credits e style sono testo semplice: non ammettono il markup di
neumaRk_text_markup.md e non hanno escape. Virgolette " e backslash \ si
scrivono così come sono e restano nel testo (HT) Il "Re" di Roma).
6. Marcatori di header¶
6.1 Definizione¶
I marcatori di header sono sequenze alfabetiche maiuscole seguite dal carattere ) e da uno spazio.
- il primo carattere è sempre
H; - la lunghezza varia da due a tre lettere.
Un marcatore che comincia con H ma non è nell'elenco di §6.2 (HZ) foo) si
ignora con W308: la riga resta parte dell'header e non diventa titolo, style
o riga musicale.
6.2 Elenco dei marcatori¶
| Marcatore | Significato |
|---|---|
HT) |
Titolo |
HSB) |
Sottotitolo |
HC) |
Credits generici |
HCM) |
Music by |
HCL) |
Lyrics by |
HCA) |
Arranger |
HCT) |
Transcriber |
HY) |
Year |
HS) |
Style |
HK) |
Key |
HM) |
Meter |
HB) |
BPM |
HV) |
Versions |
7. Titolo¶
7.1 Forma esplicita¶
- marcatore:
HT); - la prima riga
HT)(o il titolo implicito, §7.2) è il titolo principale; le righeHT)successive dichiarano titoli alternativi — alias di ricerca: il brano è trovabile con il titolo principale o con uno qualsiasi degli alternativi (es. Chega de Saudade / No More Blues); - le righe
HT)alternative possono comparire su qualsiasi riga dell'header (ordine indifferente); il serializer le riemette in coda al blocco header; - può contenere qualsiasi testo;
- può portare un tag lingua finale
[lingua](es.HT) No More Blues [EN]), che associa quel titolo a una lingua dei lyrics (neumaRk_lyrics.md§8.8) — è il ponte titolo↔lingua: aprire il brano da quel titolo preseleziona la lingua. Il tag è riconosciuto per forma sintattica: un token finale fra parentesi quadre con forma di codice lingua ([A-Za-z]{2,3}con-regioneopzionale, normalizzato a minuscolo). Un[…]finale che non ha forma di codice lingua è testo letterale del titolo — i titoli finiscono raramente per parentesi quadre (a differenza delle tonde), quindi il rischio di collisione è trascurabile. Il tag è strippato dal testo memorizzato/di ricerca.
7.2 Forma implicita¶
In assenza di marcatore, il titolo:
- deve essere la prima riga dell’header;
- deve iniziare con una lettera maiuscola o un numero (dopo eventuali spazi);
- non deve essere interpretabile come riga musicale (note, accordi o markers).
La deduzione del titolo implicito è conservativa:
in caso di dubbio, l’header fallisce.
7.3 Titolo e credits sulla stessa riga¶
È ammesso indicare i credits sulla stessa riga del titolo solo in forma implicita.
In tal caso:
- i credits devono essere racchiusi tra parentesi tonde;
- non deve essere presente alcun marcatore esplicito sulla riga.
8. Credits¶
8.1 Ruolo¶
I credits identificano i contributori del brano.
8.2 Credits con marcatori specifici¶
Ogni elemento appare su una riga autonoma con marcatore dedicato:
HCM)— Music byHCL)— Lyrics byHCA)— ArrangerHCT)— Transcriber
L’ordine è arbitrario.
Nota (edizioni del testo).
HCL)indica l'autore del testo di default (edizione neutra). L'autore di un'edizione taggata si scrive col gruppo<…>sul bloccoLYRICS)(neumaRk_lyrics.md§8.8), non qui. Una rigaHCL)setta sempre e solo il lyricsBy primario.
8.3 Credits con marcatore generico¶
- marcatore:
HC); - una sola riga;
- parentesi opzionali;
- elementi separati da
/.
Assegnazione:
- primo elemento senza prefisso → Music by;
- secondo elemento senza prefisso → Lyrics by;
arr:→ Arranger;trans:→ Transcriber;- elementi successivi senza prefisso vengono ignorati.
8.4 Credits impliciti¶
Senza marcatore esplicito, i credits:
- devono essere racchiusi tra parentesi tonde;
- devono comparire su una sola riga;
- devono essere separati da
/.
Posizione ammessa:
- stessa riga del titolo;
- oppure riga immediatamente successiva.
9. Year, Style, Key, Meter, BPM¶
9.1 Regole comuni¶
- tutti opzionali;
- possono comparire solo dopo titolo e credits (se presenti);
- in forma esplicita l’ordine è arbitrario.
9.2 Forma esplicita¶
- ogni elemento su riga dedicata;
- uso del marcatore corrispondente.
9.3 Forma implicita¶
- possono essere combinati sulla stessa riga;
- nessun marcatore;
- riconoscimento basato su pattern.
Un token che non è anno, tonalità, metro, BPM o chr fa parte dello style se
sta nella prima sequenza di parole non riconosciute (§10.2); un token non
riconosciuto dopo un elemento strutturato si ignora con W306 (es. Reb
in Swing 120bpm 4/4 Reb: il nome italiano della nota non è una tonalità).
10. Regole specifiche per elemento¶
10.1 Year¶
Indica l'anno di composizione: numero a 4 cifre compreso fra 1000 e 2999.
HY) con un valore che non è un numero (HY) abc) o fuori intervallo (HY) 999,
HY) 3000) si ignora con W304. Nella forma implicita un numero che non ha
la forma dell’anno non è un anno: resta testo (dello style, §10.2).
10.2 Style¶
Lo style è una descrizione testuale del carattere musicale del brano
(es. swing, bossa, latin, rock ballad).
Il valore dichiarato nell'header inizializza currentStyle e può
essere sovrascritto localmente in una qualsiasi misura tramite una
play directive (=Style,…) nella riga M) (vedi
neumaRk_play_directive.md).
Forma implicita¶
In forma implicita lo style è la prima sequenza di parole della riga di
metadati che non sono anno, tonalità, metro, BPM o chr, maiuscole o minuscole
(Swing, rock ballad). Lo style:
- non deve collidere con pattern validi di:
- tonalità (
Key); - metro (
Meter); - tempo (
BPM).
Se una porzione di testo può essere interpretata sia come style sia come altro elemento strutturato dell’header, prevale sempre l’interpretazione strutturata.
In caso di ambiguità non risolvibile, la deduzione dello style fallisce senza invalidare l’intero header.
10.3 Key¶
Forma:
- nota
A–G; - alterazione
bo#opzionale; - maggiore implicita;
mo-per il minore.
Valore speciale:
X
che indica assenza di tonalità, politonalità o atonalità.
Una tonalità che non ha questa forma (HK) H, HK) dm, HK) Reb) si scarta
con E301: vale la tonalità di default.
Default. Una tonalità non dichiarata vale C (Do maggiore), non X: un
brano in C può omettere la tonalità, e chi genera NRK la omette (l'export
compatto, il fly link). Un brano atonale va dichiarato esplicitamente con X.
Default cromatico autoriale (chr)¶
Un brano può avere un centro tonale reale e tuttavia essere pensato per la lettura senza armatura (alterazioni in linea). È il caso della musica a centro tonale mobile: il brano ha una tonalità (ha senso dire «facciamolo un tono sotto»), ma l’autore preferisce che si legga cromaticamente.
Per dichiararlo si aggiunge il token chr accanto alla tonalità:
HK) Db chr
oppure, in forma implicita, come token della riga di metadati:
Db 120bpm chr
Semantica:
chrè un attributo ortogonale alla tonalità: la tonalità resta quella dichiarata (es.Db), ma la resa predefinita è cromatica (nessuna armatura).- Si emette solo quando attivo; la sua assenza equivale a lettura normale con armatura.
- È una dichiarazione autoriale che viaggia col brano. Il lettore può
invertirla dalle impostazioni di visualizzazione (mostrando l’armatura), ma
ciò non modifica il sorgente
.nrk.
Da distinguere dall’atonale X: usare X solo per brani realmente privi di
centro tonale. Un brano tonale che si vuole leggere cromaticamente va scritto
con la sua tonalità più chr, non con X.
10.4 Meter¶
Forma frazionaria:
N/D
con D uguale a 2, 4, 8 o 16 e N intero di una o due cifre, almeno
1. 0/4, 5/3 o 3/32 non sono metri.
Esempi:
4/4
3/8
È consentita la forma estesa con suddivisione interna del numeratore (clave):
Esempio:
[3+3+2]/8
Ogni parte della somma vale 2, 3, 4 o 5.
Un metro non valido nell’header (HM) 5/3) si scarta con E303: resta il
metro di partenza (il default). Lo stesso criterio vale per il metro scritto
nell’oggetto di contesto di misura (neumaRk_datapack.md §7.1).
Default. Un metro non dichiarato vale 4/4.
10.5 BPM¶
- numero intero di due o tre cifre;
- in forma implicita deve essere seguito da
BPM(case-insensitive); - in forma esplicita (
HB)) il suffisso è opzionale; - non sono ammessi numeri decimali.
Un valore che non rispetta queste regole (HB) 5, HB) 1000, HB) 120.5, 5bpm)
si ignora per intero con W304: non viene troncato.
Il valore dichiarato nell'header inizializza currentBPM e può essere
sovrascritto localmente in una qualsiasi misura tramite una play
directive (=…,Nbpm) o metric modulation (=…,figura=figura) nella
riga M) (vedi neumaRk_play_directive.md).
10.6 Versions¶
Dichiara le versioni alternative di un blocco %%NAME. Disponibile solo
in forma esplicita (HV)), una riga per NAME.
HV) INTRO: [standard, adams] default=standard
HV) BRIDGE: [default, miles, jarrett] default=default
<NAME>:il nome del blocco, seguito da:.- Lista di label fra parentesi quadre, separate da virgole;
defaultindica il blocco canonico. default=<label>opzionale: specifica la variante mostrata alla prima apertura del brano (default=default= il blocco canonico).- La forma vecchia
HV) versions: […]è rifiutata con W150.
Vedi neumaRk_versions.md per la spec completa dei blocchi
%%NAME … %%end e la semantica di sostituzione.
HV) è opzionale: in sua assenza le versioni sono dedotte
direttamente dai blocchi %%NAME "label" presenti nel documento.
10bis. INFO) accanto all’header¶
Una riga INFO) contigua alle righe H…), senza riga vuota in mezzo, è
un’informazione sull’intero brano (neumaRk_datapack.md §11.1): la sua
etichetta è incisa come parte dell’intestazione, il corpo resta disponibile su
richiesta. Non è un elemento d’header: non entra nella deduzione di titolo,
credits o tonalità, non invalida l’header e può stare prima, dopo o fra le righe
H…). Una sola per intestazione (W170 sulla seconda).
HT) Blue Info
INFO) "Nota del trascrittore" Trascritto dal disco del 1961.
HCM) Anon
11. Righe vietate e fallimento dell’header¶
Fanno di tutto il blocco un datapack musicale (l’header non c’è):
- righe interpretabili come datapack musicale (§3.3).
Una riga vuota non invalida nulla: chiude l’header (§3.1). Un campo non valido, ripetuto o non riconosciuto si scarta con un diagnostico e il resto dell’header vale (§3.2).
12. Esempi¶
My Song (John Doe / Jane Roe)
1998 Swing 120BPM 4/4 Dm
equivale a
HT) My Song
HC) John Doe / Jane Roe
HY) 1998
HS) Swing
HB) 120
HM) 4/4
HK) Dm
13. Note di implementazione¶
- il parsing dell’header è conservativo;
- non è prevista alcuna correzione automatica: un valore non valido si scarta, non si corregge né si tronca;
- l’header vale campo per campo (§3.2).
14. Diagnostici¶
| Codice | Condizione | Effetto |
|---|---|---|
| E301 | Tonalità non interpretabile (HK) H, HK) Reb) |
Tonalità scartata, vale il default (§10.3) |
| E303 | Metro dell’header non valido (HM) 5/3, HM) 0/4) |
Metro scartato, resta il metro di partenza (§10.4) |
| W150 | HV) malformato o forma vecchia HV) versions: […] |
Riga ignorata (§10.6) |
| W170 | Secondo INFO) accanto all’header |
Vale il primo (§10bis) |
| W301 | Prima riga dell’header implicito da cui non si deducono titolo né credits | Riga letta come style (§7.2) |
| W304 | BPM o anno malformato o fuori intervallo (HB) 1000, HY) 999, HY) abc) |
Campo ignorato (§10.1, §10.5) |
| W305 | Campo ripetuto (HK) due volte) |
Vale il primo valido (§3.2) |
| W306 | Token non riconosciuto nella riga di metadati implicita | Token ignorato (§9.3) |
| W307 | Riga nrk: malformata (nrk:abc) |
Riga ignorata (§2) |
| W308 | Marcatore d'header sconosciuto (HZ) foo) |
Riga ignorata, resta header (§6.1) |