# neumaRk — Specifica completa (v0.6.0) > Specifica completa del linguaggio neumaRk (versione 0.6.0), concatenata in un unico file leggibile da un'IA. Source: https://neumark.dev/it/ ## Contents - neumaRk - Panoramica - Specifica formale - Header - Datapack - Note e Durate - Accordi - Seconda voce per rigo - Grace notes (appoggiature e acciaccature) - Articolazioni (riga `A)`) - Dinamiche e annotation testuali - Testo cantato (riga `L)`) - Markup testuale - Markers - Flusso, Battute e Ripetizioni - PLAY) e FORM) - Play directive - Versioni del brano - Collezioni (book / playlist) - Formati - Changelog ufficiale # neumaRk **Un linguaggio testuale per la musica, leggibile dall'uomo e interpretabile dalla macchina.** neumaRk è un modo testuale di scrivere musica — chiaro per le persone e preciso per i computer. Si colloca tra la notazione musicale tradizionale e i moderni workflow digitali, rendendo la musica facile da scrivere, condividere, analizzare, trasformare e versionare. È progettato per essere scritto **direttamente da tastiera**, senza mouse né palette grafiche, ed è ottimizzato per **lead sheet**, bozze musicali e strutture armoniche — contenuti a una o poche voci, accordi e struttura. Non è pensato per grandi partiture orchestrali, né per sostituire la notazione tradizionale: ne è una base complementare, focalizzata sul **significato** musicale più che sulla resa grafica. Se sai leggere sigle di accordo e pattern ritmici, sai già leggere neumaRk. --- ## Da dove partire - **Cos'è, obiettivi e casi d'uso** → **Overview** (`neumaRk_overview.md`) - **Il linguaggio, in dettaglio normativo** → **Specification** (`neumaRk_specification.md`) e i documenti collegati (note e durate, accordi, flusso e ripetizioni, dinamiche, markup testuale, voci, collezioni book/playlist, …) - **Le evoluzioni del linguaggio** → **Changelog** (`neumaRk_changelog.md`) > I concetti di fondo — livelli di dettaglio (Compact / Human / Verbose), > sintassi formale e informale, relazione con la notazione tradizionale, > obiettivi di progettazione — sono trattati nell'**Overview**. --- # Panoramica ## 1. Cos'è neumaRk **neumaRk** è un sistema formale di rappresentazione testuale della musica. È progettato per essere contemporaneamente **human‑readable** e **machine‑readable**, con una sintassi e una semantica definite che consentono di descrivere eventi musicali, strutture temporali, armonia, dinamiche, testi e sezioni formali. neumaRk è, allo stesso tempo: - un **linguaggio di markup musicale**; - una **DSL (Domain Specific Language)** orientata alla notazione musicale; - un **formato testuale puro**, utilizzabile come file standalone. Il linguaggio nasce per colmare lo spazio tra la scrittura musicale tradizionale e le esigenze dei sistemi software moderni: versionamento, parsing affidabile, compattezza, condivisione e trasformazione automatica. --- ## 2. Obiettivi di progettazione neumaRk è progettato attorno ai seguenti obiettivi principali: 1. **Chiarezza semantica** Ogni costrutto ha un significato preciso e non ambiguo. 2. **Leggibilità umana** Un file neumaRk può essere letto e compreso direttamente da un musicista o da un autore. 3. **Efficienza e rapidità di scrittura** neumaRk è progettato per favorire una scrittura musicale rapida ed efficiente, basata su input testuale e deduzione contestuale, riducendo al minimo le informazioni ridondanti. 4. **Affidabilità del parsing** La sintassi consente un parsing deterministico, anche in presenza di informazioni implicite. 5. **Flessibilità espressiva** Lo stesso contenuto musicale può essere espresso in forme più compatte o più verbose. 6. **Neutralità rispetto al rendering** Il linguaggio descrive _cosa_ è la musica, non _come_ deve essere disegnata. 7. **Compatibilità con workflow moderni** File testuali, diff‑friendly, adatti a sistemi di versionamento e a scambi via URL. --- ## 3. neumaRk come DSL musicale neumaRk è una DSL: un linguaggio specializzato, con un dominio ben definito. Il dominio di neumaRk comprende: - tempo e metrica; - altezze e durate; - articolazioni e dinamiche; - armonia e sigle di accordo; - testo (lyrics); - struttura formale (marker, sezioni, ripetizioni); - suggerimenti di layout e formattazione. Il linguaggio non tenta di replicare ogni aspetto grafico della notazione musicale tradizionale, ma di fornire una rappresentazione testuale coerente e trasformabile. --- ## 4. Human‑readable e Machine‑readable neumaRk è progettato per essere: - **leggibile dall'uomo**, senza necessità di strumenti dedicati; - **interpretabile dalla macchina**, senza euristiche fragili. Questo risultato è ottenuto tramite: - una sintassi line‑based; - un insieme ridotto di simboli con significato stabile; - regole esplicite per la deduzione delle informazioni implicite. Un file neumaRk può essere scritto rapidamente a mano, ma anche generato, validato e trasformato automaticamente. --- ## 5. Sintassi formale e sintassi informale Uno degli elementi centrali di neumaRk è la coesistenza di **due livelli di sintassi**: - **Sintassi formale** Rigorosa, completamente disambiguata, pensata per garantire un parsing affidabile in qualsiasi situazione. - **Sintassi informale** Più compatta e naturale da scrivere, basata su convenzioni comuni e deduzione contestuale. Le due sintassi non sono linguaggi separati: sono due modalità espressive dello stesso linguaggio. L'autore può decidere, caso per caso, se privilegiare: - la massima precisione semantica; - la massima velocità e leggibilità. --- ## 6. Formati di file e livelli di dettaglio neumaRk supporta diversi **livelli di esplicitazione**, che influenzano la quantità di informazione presente nel file: - **Compact** Informazioni ridotte all'essenziale. Massima compattezza. - **Human** Compromesso tra compattezza e chiarezza. Orientato alla lettura umana. - **Verbose** Tutte le informazioni sono esplicite. Nessuna ambiguità semantica. Questi livelli non definiscono linguaggi diversi, ma modalità di utilizzo dello stesso linguaggio. --- ## 7. Casi d'uso tipici neumaRk è pensato per supportare, tra gli altri, i seguenti scenari: - scrittura e condivisione di leadsheet; - rappresentazione testuale di partiture; - embedding di musica in URL o messaggi; - parsing e rendering automatico; - editing collaborativo e versionamento; - conversione verso formati grafici o audio. --- ## 8. Relazione con la notazione musicale tradizionale neumaRk non è una trascrizione diretta della notazione su pentagramma. Molti concetti sono condivisi (durate, battute, legature, accordi), ma il linguaggio: - privilegia la **semantica** rispetto alla grafica; - consente informazioni implicite non esplicitabili facilmente su carta; - separa la descrizione musicale dalla resa visiva. La notazione tradizionale è una possibile _rappresentazione di output_, non il modello interno. --- ## 9. Non‑obiettivi neumaRk **non** ha come obiettivo: - sostituire la notazione musicale tradizionale in ambito editoriale; - definire uno standard grafico unico; - rappresentare micro‑dettagli calligrafici; - coprire ogni possibile pratica musicale esistente. Il linguaggio è intenzionalmente focalizzato e modulare. --- ## 10. Organizzazione della specifica La documentazione di neumaRk è suddivisa in più file, ciascuno con una responsabilità specifica: questa panoramica concettuale, la specifica normativa, e i documenti di dettaglio (header, datapack, note e durate, accordi, flusso, dinamiche, markup, voci, grace notes, ecc.). L'elenco completo e aggiornato dei documenti normativi è in `neumaRk_specification.md` §7. Per la pagina d'ingresso e la navigazione, vedi `index.md`. Questa suddivisione consente una lettura progressiva e una manutenzione evolutiva della specifica. --- # 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**. --- ## 2. Livelli della specifica La specifica neumaRk è organizzata in più livelli, ciascuno con responsabilità precise: 1. **Livello sintattico** - definisce la grammatica testuale - stabilisce quali sequenze di caratteri sono valide 2. **Livello strutturale** - definisce la struttura logica del documento - stabilisce le relazioni tra le varie sezioni 3. **Livello semantico** - definisce il significato musicale dei costrutti - chiarisce ambiguità e casi limite 4. **Livello di validazione** - definisce le condizioni di validità - stabilisce gli errori e gli stati non validi ## 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: 1. Header (metadati) 2. 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.md` - `neumaRk_formats.md` - `neumaRk_header.md` - `neumaRk_datapack.md` - `neumaRk_markers.md` - `neumaRk_chords.md` - `neumaRk_notes_and_durations.md` - `neumaRk_grace_notes.md` - `neumaRk_voices.md` - `neumaRk_articulations.md` - `neumaRk_lyrics.md` - `neumaRk_flow_and_repeats.md` - `neumaRk_dynamics.md` - `neumaRk_text_markup.md` - `neumaRk_play_and_form.md` - `neumaRk_play_directive.md` - `neumaRk_versions.md` - `neumaRk_collections.md` Ciascun documento approfondisce in modo normativo un aspetto specifico del linguaggio. --- ## 8. Compatibilità e versioning Ogni documento neumaRk deve dichiarare esplicitamente la versione del linguaggio utilizzata. La prima riga del documento deve riportare la sequenza `nrk:`seguita dalla versione di riferimento nella forma major.minor 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. Costrutti non definiti o non riconosciuti rendono il documento **non valido**, salvo diversa indicazione esplicita. --- # 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**; - deve essere la **prima riga del file**; - **non fa parte dell’header**. 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 Criterio “tutto o niente” (parsing conservativo) Il blocco iniziale viene riconosciuto come header **solo se tutte le sue righe sono valide** secondo le regole di questo documento. Se anche una sola riga: - viola una regola sintattica; - contiene un elemento non ammesso; - oppure è interpretabile come riga musicale, l’intero blocco viene classificato come **non header**. In tal caso: - il parsing dell’header fallisce; - il blocco viene successivamente analizzato come datapack musicale. Non è ammesso parsing parziale dell’header. --- ### 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`. ## 5. Sintassi formale e sintassi informale L’header supporta due modalità sintattiche: **formale (esplicita)** e **informale (implicita)**. ### 5.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. --- ### 5.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. --- ### 5.3 Precedenze In caso di ambiguità o conflitto, prevale: 1. la sintassi formale; 2. le regole di posizione; 3. la deduzione semantica; 4. il fallimento del parsing dell’header. --- ## 6. 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 §11.6) Tutti gli elementi sono opzionali. Qualunque altro contenuto invalida l’intero header. --- ## 7. Marcatori di header ### 7.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. --- ### 7.2 Elenco dei marcatori | Marcatore | Significato | | --------- | ---------------- | | `HT) ` | Titolo | | `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 | --- ## 8. Titolo ### 8.1 Forma esplicita - marcatore: `HT) `; - la prima riga `HT)` è il **titolo principale**; sono ammesse righe `HT)` successive come **titoli alternativi** (alias di ricerca / per-lingua); - può contenere qualsiasi testo; - può portare un **tag lingua** finale `[lingua]` (es. `HT) No More Blues [EN]`): forma sintattica `[a-z]{2,3}(-regione)?`, case-insensitive, strippato dal testo memorizzato. Associa quel titolo a una lingua — è il **titolo tradotto** per le edizioni di quella lingua (`neumaRk_lyrics.md` §8.8). --- ### 8.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. --- ### 8.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. --- ## 9. Credits ### 9.1 Ruolo I credits identificano i contributori del brano. --- ### 9.2 Credits con marcatori specifici Ogni elemento appare su una riga autonoma con marcatore dedicato: - `HCM) ` — Music by - `HCL) ` — Lyrics by - `HCA) ` — Arranger - `HCT) ` — 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 blocco `LYRICS)` (`neumaRk_lyrics.md` §8.8), non qui. > Il vecchio credit per-lingua `HCL) … [lingua]` è **rimosso**: una riga > `HCL)` setta sempre e solo il lyricsBy primario. --- ### 9.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. --- ### 9.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. --- ## 10. Year, Style, Key, Meter, BPM ### 10.1 Regole comuni - tutti opzionali; - possono comparire **solo dopo titolo e credits** (se presenti); - in forma esplicita l’ordine è arbitrario. --- ### 10.2 Forma esplicita - ogni elemento su riga dedicata; - uso del marcatore corrispondente. --- ### 10.3 Forma implicita - possono essere combinati sulla stessa riga; - nessun marcatore; - riconoscimento basato su pattern. --- ## 11. Regole specifiche per elemento ### 11.1 Year Indica l'anno di composizione: numero a 4 cifre compreso fra 1000 e 2999. ### 11.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: - deve iniziare con una lettera minuscola (dopo eventuali spazi); - 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. --- ### 11.3 Key Forma: - nota `A–G`; - alterazione `b` o `#` opzionale; - maggiore implicita; - `m` o `-` per il minore. Valore speciale: ``` X ``` che indica assenza di tonalità, politonalità o atonalità. --- ### 11.4 Meter Forma frazionaria: N/D con `N` e `D` numeri interi di una o due cifre. Esempi: ``` 4/4 3/8 ``` È consentita la forma estesa con suddivisione interna del numeratore (clave): Esempio: ``` [3+3+2]/8 ``` --- ### 11.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. 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`). ### 11.6 Versions Dichiara le **versioni alternative** del brano. Disponibile solo in forma **esplicita** (`HV) `). ``` HV) versions: [original, miles, jarrett] default=original ``` - `versions:` parola chiave obbligatoria. - Lista di label fra parentesi quadre, separate da virgole. - `default=