Specifica formale¶
1. Scopo del documento¶
Questo documento definisce la specifica formale del linguaggio neumaRk.
Stabilisce in modo normativo:
- quali costrutti sono validi
- come devono essere interpretati
- quali regole devono essere rispettate da parser, validatori e strumenti di rendering
Tutto ciò che è descritto in questo documento è da considerarsi vincolante, salvo il livello informativo di resa di riferimento (§2).
2. Livelli della specifica¶
La specifica neumaRk è organizzata in più livelli, ciascuno con responsabilità precise:
-
Livello sintattico
-
definisce la grammatica testuale
-
stabilisce quali sequenze di caratteri sono valide
-
Livello strutturale
-
definisce la struttura logica del documento
-
stabilisce le relazioni tra le varie sezioni
-
Livello semantico
-
definisce il significato musicale dei costrutti
-
chiarisce ambiguità e casi limite
-
Livello di validazione
- definisce le condizioni di validità
-
stabilisce gli errori e gli stati non validi
-
Livello di resa di riferimento (informativo)
- descrive come l'implementazione di riferimento disegna i costrutti: glifi e codepoint, font, fattori di scala, corpi, colori, distanze
- non è vincolante: un'implementazione conforme rispetta le regole di notazione, non questi parametri
Le regole di notazione restano normative anche quando stanno in una sezione intitolata «Resa» o «Render»: quali segni compaiono, dove rispetto al rigo e alle note, a cosa si ancorano, con quale cornice. I passaggi che descrivono soltanto la resa di riferimento sono marcati Resa di riferimento (informativa); dove una regola normativa cita un parametro di disegno (un codepoint, un font, un fattore), quel parametro è informativo.
Resa di riferimento (informativa). La partitura è disegnata con un inchiostro unico: note, sigle, label, cornici, linee e testi hanno lo stesso colore. Fanno eccezione i link (
neumaRk_text_markup.md§3quater), distinti a schermo; in stampa tutto esce in nero.
2.1 Contesto musicale persistente¶
Il parsing di un documento neumaRk avviene all’interno di un contesto musicale persistente.
Il contesto musicale conserva le ultime informazioni esplicite rilevanti (altezze, durate, stato metrico) e persiste lungo l’intero documento, attraversando:
- righe;
- misure;
- datapack consecutivi.
Il contesto musicale non viene automaticamente resettato all’inizio di un nuovo datapack.
Un datapack rappresenta un’unità strutturale e di sincronizzazione verticale, ma non costituisce un confine semantico per la deduzione musicale.
In assenza di valori espliciti, le regole di deduzione fanno sempre riferimento allo stato corrente del contesto musicale.
3. Terminologia normativa¶
In questo documento si utilizzano i seguenti termini con significato normativo:
- deve / non deve: requisito obbligatorio
- può / può non: comportamento opzionale
- non è valido: il documento deve essere rifiutato
- viene interpretato come: comportamento deterministico
4. Uso contestuale dei simboli¶
Alcuni simboli testuali di neumaRk hanno una semantica contestuale,
determinata dal tipo di riga musicale in cui compaiono. L'algoritmo
normativo con cui il tipo di riga stesso viene dedotto (in assenza di
marcatore esplicito) è in neumaRk_datapack.md §3.bis.
In particolare:
- il simbolo
.(punto) - il simbolo
!(punto esclamativo)
assumono significati differenti a seconda che compaiano in:
- righe di note (
N)); - righe di accordi (
C)).
Essi assumono significati differenti, anche all'interno delle stesse righe, a seconda della loro posizione.
Il contesto di riga e la posizione in relazione agli altri elementi della riga sono sempre sufficienti a risolvere la semantica del simbolo in modo deterministico.
Non esiste alcun caso valido in cui un simbolo possa essere ambiguo all’interno dello stesso contesto di riga.
5. Identificazione del documento e estensione¶
Un documento neumaRk è un file di testo codificato in UTF-8.
L’estensione di file raccomandata per i documenti neumaRk è:
.nrk
L’uso dell’estensione .nrk consente a strumenti, editor e sistemi operativi
di riconoscere in modo affidabile i documenti neumaRk.
L’estensione è raccomandata ma non obbligatoria.
Un documento è considerato valido in quanto documento neumaRk in base al suo
contenuto, e non in base al nome del file o alla sua estensione.
Gli strumenti possono assumere l’estensione .nrk come predefinita
in fase di lettura o scrittura di file neumaRk.
6. Struttura generale di un documento neumaRk¶
Un documento neumaRk può contenere, in ordine:
- Header (metadati)
- Contenuto musicale e contenuto di formattazione
L’ordine delle sezioni è significativo e deve essere rispettato.
Delimitazione strutturale¶
In neumaRk, un rigo vuoto ha valore strutturale.
I righi vuoti delimitano blocchi logici del documento, in particolare:
- la fine dell’header;
- la separazione tra datapack musicali consecutivi.
Un blocco strutturale (header o datapack) è sempre costituito da una o più righe non vuote consecutive.
7. Riferimenti ai documenti correlati¶
La presente specifica fa riferimento ai seguenti documenti:
neumaRk_overview.mdneumaRk_formats.mdneumaRk_header.mdneumaRk_datapack.mdneumaRk_markers.mdneumaRk_chords.mdneumaRk_notes_and_durations.mdneumaRk_grace_notes.mdneumaRk_voices.mdneumaRk_articulations.mdneumaRk_fingering.mdneumaRk_lyrics.mdneumaRk_flow_and_repeats.mdneumaRk_dynamics.mdneumaRk_text_markup.mdneumaRk_play_and_form.mdneumaRk_text_line.mdneumaRk_play_directive.mdneumaRk_versions.mdneumaRk_collections.mdneumaRk_footnotes.md
Ciascun documento approfondisce in modo normativo un aspetto specifico del linguaggio.
8. Compatibilità e versioning¶
Ogni file neumaRk scambiato (esportato, importato, condiviso) deve dichiarare esplicitamente la versione del linguaggio utilizzata.
La prima riga del file deve riportare la sequenza nrk: seguita dalla versione di riferimento nella forma major.minor (dettagli in neumaRk_header.md §2)
esempio
nrk:0.6
Le regole di compatibilità tra versioni e l'evoluzione del linguaggio sono documentate nel neumaRk_changelog.md.
9. Estensioni¶
Il linguaggio neumaRk può essere esteso solo nei limiti esplicitamente consentiti dalla specifica.
Un costrutto non definito o non riconosciuto non è valido e il parser lo segnala con un diagnostico. La lettura però prosegue: il costrutto si scarta o si ripara nel modo descritto dal documento che lo riguarda, e il resto del brano resta leggibile.
I diagnostici sono di due severità. Un errore (E###) segnala un costrutto
non valido, che il parser ripara o scarta prima di proseguire; un avviso
(W###) segnala un costrutto ammesso ma probabilmente non voluto, o un valore
ignorato. Nessuno dei due interrompe la lettura del documento. L'elenco completo
dei codici è nel neumaRk_changelog.md.