Markers¶
1. Cos’è un Marker¶
Un marker è un elemento strutturale non musicale che identifica un punto significativo nel flusso del brano. I marker non si riferiscono a un evento musicale, non hanno durata musicale propria e non influiscono direttamente sul contenuto musicale (note, accordi, ritmi), ma servono a:
- segmentare il brano in sezioni logiche;
- facilitare la lettura e l’orientamento umano;
- fornire ancoraggi semantici per il rendering, la navigazione e l’esecuzione;
- supportare forme musicali, ripetizioni e riferimenti.
I marker fanno parte del datapack musicale, ma appartengono alla sfera della struttura, non della notazione musicale.
Appartenenza semantica¶
Un marker appartiene semanticamente a una misura.
Esso identifica, etichetta o qualifica una misura come unità strutturale del brano e non è legato al flusso musicale o all’ordine di esecuzione.
2. Riga dei Markers¶
I marker sono contenuti in una riga di markers, che può essere:
- dichiarata esplicitamente con il marcatore di riga
M); - dedotta implicitamente dal contenuto della riga.
2.1 Posizione nel datapack¶
- La riga dei markers, se presente, è la prima riga del datapack.
- È opzionale.
- Può comparire una sola riga di markers per datapack. Se ne compaiono due, il
parser le fonde senza diagnostici, campo per campo, e per ciascun campo
(sezione, annotazione) vale l'ultima:
M) [A]seguita daM) "poco;a poco" [B]dà la sezioneBcon l'annotazione. Il documento riscritto ne fa una riga sola, con la sezione prima dell'annotazione (M) | [B] "poco;a poco" |).
Best practice: collocare nella riga dei markers anche i decoratori di misura (volta, segno, coda, ecc.), per concentrare la struttura formale in un unico punto.
Un decoratore scritto sulla riga dei markers si applica alla stessa misura della barline allineata, esattamente come se fosse sulla riga note/accordi: l'effetto su rendering ed esecuzione è identico. È ammessa anche una barline di solo flusso a inizio sezione, senza altro testo sulla riga — es. M) |@ (coda) o M) |$ (segno). Se due righe portano decoratori divergenti sulla stessa misura, vince la riga scritta prima nel datapack — la riga dei markers, che sta in testa — e il parser emette il warning W159 sulla riga che perde (neumaRk_datapack.md §7.3); decoratori identici sulle due righe (allineamento visivo) non producono alcun warning.
3. Sintassi dei Markers¶
Un marker è espresso in due forme container, che differiscono per il ruolo strutturale e per la presenza del box grafico:
[<testo>]— sezione: unità strutturale del brano, con box;"<testo>"— annotazione: testo descrittivo, senza box.
[Intro] sezione (con box)
[A] sezione
"freely" annotazione
"swing feel" annotazione
Il marker ammette il markup testuale definito in
neumaRk_text_markup.md. Lo stile di default è bold, size body, in
entrambe le forme.
3.1 Sezione vs annotazione¶
I due container hanno valore semantico diverso:
| Forma | Tipo | Valore strutturale | Target PLAY/FORM | Chiude scope collapsible |
|---|---|---|---|---|
[…] |
sezione | sì (unità del brano) | sì | sì |
"…" |
annotazione | no (testo descrittivo) | no | no |
La sezione si può scrivere anche ["NOME"]: vale [NOME], le virgolette
delimitano il nome e non ne fanno parte (né del target di PLAY)/FORM)), e
non aprono un'annotazione.
Una sezione identifica un'unità strutturale ricorribile e
referenziabile (Intro, Verse, Chorus, A, B, …). Le sezioni sono i
target di PLAY) / FORM) (vedi neumaRk_play_and_form.md §3.1) e
delimitano lo scope delle sezioni collassabili (vedi §4).
Un'annotazione è un testo libero senza valore strutturale (es.
"freely", "swing feel", "con feeling"). Le annotazioni non sono
referenziabili da PLAY) / FORM) e non chiudono lo scope di una
sezione collassabile.
Un ; nell'annotazione va a capo (neumaRk_text_markup.md §3bis): la
pila sta sopra il rigo e cresce verso l'alto, l'ultima riga resta dove
sarebbe la riga singola, allineata a sinistra.
M) | "poco;a poco" | // → poco
// a poco
Il nome di sezione […] è escluso: lì il ; resta letterale.
Nel nome di sezione \] è una ] letterale e non chiude il box, come
nelle label e nelle annotazioni (neumaRk_text_markup.md §4):
M) | [Coda \] finale] | // sezione «Coda ] finale»
N) | c4 d e f |
PLAY) e FORM) la referenziano con lo stesso nome escapato
(neumaRk_play_and_form.md §3.1).
Nota normativa.
[…](sezione) e"…"(annotazione) differiscono per due soli aspetti operativi: le annotazioni"…"non sono target diPLAY)/FORM)e non interagiscono con lo scope delle sezioni collassabili[? …](§4). Per il resto restano entrambe testo formattabile.
3.2 Ancoraggio temporale¶
- Un marker si riferisce all'inizio della battuta in cui compare.
- Una misura ha una sola sezione
[…]e una sola annotazione"…": vale la prima, le altre della stessa misura si scartano con W186 (§7). Una[…]scritta dentro un'annotazione è testo dell'annotazione, non una sezione. - Se preceduto da una barline e nella forma con box
[…], deve essere separato da essa da almeno uno spazio, per evitare ambiguità con i decoratori di volta. - La forma
"…"non collide con i decoratori di volta e può essere adiacente alla barline; resta tuttavia raccomandato lo spazio per leggibilità.
Esempio valido:
M) | [A]
M) | "freely"
Senza il marcatore M) una riga che contiene un'annotazione "…" è dedotta
come riga di accordi, con la "…" come label di riga: il predicato dei Markers
impliciti ammette solo […], barre e spazi (neumaRk_datapack.md §3.bis.4).
Le annotazioni di marker si scrivono quindi sulla riga M).
Esempio non valido:
M) |[A] // letto come volta con l'etichetta A, non come sezione
4. Sezioni collassabili¶
Una sezione può essere dichiarata collassabile (anche detta
opzionale) anteponendo il prefisso ? (carattere ? seguito da
uno spazio) all'interno del marker:
[? Verse]
[? Solo 2]
[? Outro]
Una sezione collassabile è una proprietà di lettura del marker: una resa interattiva può permettere a chi legge di espandere o comprimere la sezione. Lo stato espanso/compresso è una preferenza di chi legge, conservata dall'host e non nel file NRK.
4.1 Scope della sezione collassabile¶
Lo scope di [? NAME] si estende dalla misura del marker fino al
primo dei seguenti eventi:
- inizio di un'altra sezione
[…](di qualsiasi nome, collassabile o no, incluso il marker anonimo[!]di §4.2); - fine del documento.
Le annotazioni "…" interposte non chiudono lo scope:
appartengono comunque alla sezione collassabile corrente.
M) [? Verse] | … | "freely" | … | [Chorus] | …
└─────── scope di Verse ─────┘
└ Chorus apre nuovo scope
4.2 Marker anonimo [!] (chiusura implicita di sezione opzionale)¶
Quando una sezione opzionale termina e non c'è un marker successivo
che la chiude naturalmente (perché segue flusso "anonimo", non
strutturato come sezione), si usa il token speciale [!] (parentesi
quadre con un singolo !, senza spazi).
[!] è semanticamente un marker di apertura di sezione non-opzionale
anonima: aderisce alla convenzione "marker = inizio-misura" (§3.2)
e la chiusura dello scope precedente è il side-effect naturale della
regola §4.1.
M) [? Coda] | … | … | [!] | … |
└── scope di Coda ─┘
└ flusso non-collassabile, anonimo
Proprietà:
- Non renderizzato come marker (nessun box, nessuna etichetta).
- Non referenziabile da
PLAY)/FORM): non ha NAME. Se usato come reference è reference-broken (vedineumaRk_play_and_form.md§7.3). - Ammesso ovunque:
[!]non richiede una sezione opzionale aperta. Se non c'è scope da chiudere il token è ridondante (warning W146, non bloccante).
4.3 Niente annidamento¶
Una [? Inner] interna a un'altra [? Outer] chiude lo scope di
Outer e apre quello di Inner, secondo la regola generale §4.1. Non
esiste un meccanismo di sezioni collassabili annidate.
M) [? Outer] | … | [? Inner] | … |
└ Outer ──┘ └─ Inner ─────…
4.4 Stato di default¶
All'apertura di un brano per la prima volta, le sezioni collassabili sono espanse. Chi legge le comprime esplicitamente; lo stato lo conserva l'host (§4).
Resa di riferimento (informativa). L'etichetta di una sezione collassabile espansa porta un chevron
▾dopo il nome, perché la presenza di sezioni collassabili sia riconoscibile anche quando sono tutte espanse; una sezione compressa si riduce all'etichettaNAME ▸su una riga propria. Il chevron è la maniglia che espande o comprime: appartiene alla resa interattiva, e le esportazioni statiche (PDF) non lo riportano: resta l'etichetta[NAME].
4.5 Riferimenti da PLAY/FORM¶
Una sezione [? NAME] è referenziata da PLAY) / FORM) usando il
solo NAME, senza prefisso ?:
M) [? Verse] | … | [Chorus] | …
PLAY) [Verse] [Chorus]
Il prefisso ? è una proprietà di lettura della sezione, non parte del nome
strutturale. Il binding fra PLAY) e M) è per text-equality sul
NAME, ignorando il prefisso ?.
4.6 Esecuzione¶
Lo stato collassato/espanso riguarda solo la lettura: una sezione collassabile è eseguita esattamente come una sezione ordinaria, indipendentemente dal fatto che chi legge l'abbia collassata o espansa.
Una sezione collassata non viene "saltata" nell'esecuzione. Per omettere
una sezione dall'esecuzione esistono altri meccanismi (versioni,
PLAY) esplicita che la esclude).
4.7 Vincolo a inizio rigo¶
Una sezione collassabile deve iniziare e finire a inizio rigo (= a inizio di un system / datapack). Concretamente:
- il marker
[? NAME]deve comparire nella prima misura del system in cui appare; - la chiusura dello scope (qualsiasi altro
[…]o[!]) deve a sua volta comparire nella prima misura del system in cui appare; - lo scope termina anche a EOF (caso valido).
Razionale: comprimere una sezione toglie righe intere; una sezione che inizia o finisce a metà rigo produrrebbe una resa ambigua (mezzo rigo sparirebbe, lasciando moncheria visiva).
In caso di violazione:
- emessa W151 (warning, non bloccante);
- la sezione non è collassabile: resta sempre espansa, anche in una resa interattiva.
5. Rilevanza identitaria¶
Il prefisso ~ su un marker di sezione la dichiara identitaria: ne
segnala il tema come quello che caratterizza il brano ("la parte che
fa riconoscere il pezzo"). È una proprietà strutturale e portabile
della composizione — viaggia col file — non un dato dell'host.
M) [Intro] | … |
M) [~ Tema] | … | ← sezione identitaria del brano
M) [Coda] | … |
~ non è renderizzato (nessun box, nessuna etichetta aggiuntiva: la
sezione si disegna come una [Tema] normale) ed è preservato in
round-trip dal serializer.
La rilevanza identitaria è un'annotazione musicale, non un'etichetta host: indica quale musica caratterizza il brano. Il marker è agnostico alla dimensione d'analisi: l'host può derivarne ciò che serve sotto qualunque profilo — melodia, armonia, ritmo, ritmo armonico, ecc. (elenco non esaustivo). Lo spec definisce quale regione è identitaria; cosa se ne estrae e su quale dimensione è fuori dal linguaggio.
5.1 Scope della regione di rilevanza¶
Lo scope di [~ NAME] si estende dalla misura del marker fino al
primo dei seguenti eventi:
- l'inizio di una nuova sezione
[…]priva del prefisso~; - la fine del documento.
Una sezione successiva che porta anch'essa ~ non chiude la
regione: la continua. Sezioni ~ consecutive formano quindi
un'unica area di rilevanza; solo una sezione senza ~ la chiude.
M) [~ A] | … | [~ B] | … | [C] | … | [~ D] | …
└──── area di rilevanza 1 (A+B) ────┘ └ area 2 (D)
└ C non rilevante, chiude l'area 1
Le annotazioni "…" interposte non chiudono lo scope (come in §4.1).
5.2 Più aree per brano¶
Sono ammesse più aree di rilevanza melodica nello stesso brano (le
~ non consecutive sono aree distinte, vedi [~ D] sopra). Il modo in
cui l'host usa una o più aree (es. quale considerare per quale scopo)
non è materia di linguaggio.
5.3 Default (nessun marker ~)¶
In assenza di qualsiasi [~ …] nel brano, la regione melodicamente
rilevante è implicitamente il tratto dall'inizio del brano fino
alla prima sezione esclusa (o fino a EOF se non ci sono sezioni). I
brani che non usano il marker hanno quindi una regione di rilevanza
ben definita e host-independent.
5.4 Marker anonimo [~]¶
[~] (parentesi quadre con un solo ~, senza spazi) è una sezione
anonima identitaria: si comporta come il marker anonimo
[!] (§4.2) — apre una sezione non-opzionale e chiude lo scope
precedente — ma è flaggata ~. Serve a marcare "da qui è
rilevante" quando il tema non è una sezione nominata. Specularmente, un
[!] (senza ~) che segue una regione di rilevanza la chiude
(è una sezione priva di ~, §5.1).
5.5 Composizione con ? (collassabile + rilevante)¶
Una sezione può essere insieme collassabile e identitaria. I due
prefissi si accettano in ordine libero in input: [?~ NAME] e
[~? NAME] sono equivalenti. Essendo semanticamente identiche, il
serializer le normalizza alla forma canonica [?~ NAME] (come già
normalizza spaziatura e altri aspetti dei marker).
M) [?~ Bridge] | … | ≡ M) [~? Bridge] | … |
5.6 Riferimenti da PLAY/FORM¶
Come per ? (§4.5), una sezione [~ NAME] è referenziata da PLAY) /
FORM) con il solo NAME, senza prefisso. Il binding è per
text-equality sul NAME, ignorando i prefissi ~ e ?.
M) [~ Tema] | … |
PLAY) [Intro] [Tema] [Coda]
5.7 Ancoraggio¶
[~ NAME] / [~] seguono l'ancoraggio delle sezioni (§3.2, §4.7):
compaiono a inizio misura; i confini di scope (sezione senza ~, o EOF)
cadono a inizio rigo come ogni altro confine di sezione.
6. Play directive in riga M)¶
La riga M) ammette, oltre ai marker testuali […] / "…", anche
play directive nella forma (=Style,Tempo) per cambiare lo style
e/o il tempo del brano a partire da una misura specifica. Vedi
neumaRk_play_directive.md per la spec completa.
La play directive convive liberamente con i marker testuali nella stessa misura. La disambiguazione fra i token è per delimitatori:
| Token | Tipo |
|---|---|
[…] |
sezione (marker strutturale) |
[? …] |
sezione collassabile (vedi §4) |
[~ …] |
sezione identitaria (§5) |
[!] |
sezione anonima non-opzionale (§4.2) |
[~] |
sezione anonima identitaria (§5.4) |
"…" |
annotazione (testo descrittivo) |
(=…) |
play directive |
Esempio:
M) | [Intro] (=Rock,120bpm) | | | [A] (=swing,140bpm) |
7. Regole di Validità¶
Una riga di markers è valida se:
- contiene solo sezioni
[…]/[? …]/[~ …], marker anonimi[!]/[~], annotazioni"…"e play directive(=…), separati da spazi e segni di battuta; - non contiene pattern riconducibili a note o accordi;
- rispetta le regole di separazione da barline.
In caso di violazione:
- la riga non viene riconosciuta come riga di markers;
- il parsing del datapack prosegue secondo le regole di deduzione standard.
Una riga scritta col marcatore M) resta invece una riga di markers: ogni
token che non è una sezione, un'annotazione, una play directive o un oggetto di
contesto a un confine di misura (neumaRk_datapack.md §7.3) si scarta con
W186. Una tonalità staccata ha il suo messaggio
(W186.key_free_position): per cambiare tonalità la si incolla alla barra.
M) | [A] foo | (Bb) | // W186 su `foo`, W186.key_free_position su `(Bb)`
N) | c4 d e f | g a b c |
Anche la seconda sezione o la seconda annotazione della stessa misura (§3.2) si
scarta con W186 (W186.section_extra, W186.annotation_extra): vale la
prima. Per più righe di testo si scrive una sola annotazione e si va a capo con
; (§3.1).
M) | [A] [B] "poco" "a poco" | // W186 su `[B]` e su `"a poco"`
N) | c4 d e f |
M) | [A] "poco;a poco" | // una sezione, un'annotazione su due righe
N) | c4 d e f |
7.1 Codici diagnostici¶
| Codice | Severità | Descrizione |
|---|---|---|
| W146 | WARNING | [!] ridondante: nessuna sezione opzionale da chiudere |
| W151 | WARNING | Sezione opzionale non-collassabile: [? NAME] o la sua chiusura non a inizio rigo (§4.7) |
| W186 | WARNING | Token fuori dal vocabolario della riga M) (W186.key_free_position per una tonalità staccata), seconda sezione o annotazione della stessa misura (W186.section_extra, W186.annotation_extra): scartato (§3.2, §7) |