Vai al contenuto

Articolazioni (riga A))

STATO: SPEC. Binding e ordine non sono ridefiniti qui: vedi neumaRk_datapack.md §2.1 e §3. Cronologia in neumaRk_changelog.md, Novità della 0.6.

1. Definizione

La riga A) (Articulations) porta le articolazioni e gli ornamenti da applicare, posizione per posizione, agli eventi della riga musicale a cui è legata. È un layer parallelo: non altera ritmo, durate o flusso, solo gli attributi notazionali degli eventi.

2. Posizione strutturale e binding

Marcatore, opzionalità e ordine logico sono definiti in neumaRk_datapack.md §2.1 (tabella marcatori) e §3 (ordine implicito: A) è opzionale e precede la riga N) del proprio gruppo di note). In sintesi operativa:

  • A) si riferisce alla riga immediatamente sotto ("modello §4.A.5"): i suoi token attendono (pending) e si drenano su quella riga, per l'intero rigo.
  • Quale riga:
  • se subito sotto c'è una C) (accordi), l'intera A) annota quella C) — solo per lo stave 0 (l'armonia vive in MeasureShared). Vedi §2.1: i marchi vanno sulle teste del ritmo accordale (se la C) ha ritmo), le annotazioni testo ("…", ["…"], ("…")) sopra gli accordi stampati;
  • se subito sotto c'è una N), annota quella N), stesso stave.
  • In multi-stave ogni rigo ha il proprio bucket di pending; la voce 2 (N2) ha un bucket A) indipendente (vedi neumaRk_voices.md §3.1).
  • 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 con W174 (neumaRk_datapack.md §4.1). Fa eccezione il datapack senza righe di note, dove l'A) si applica alle pause d'ufficio.

2.1 A) sopra gli accordi (annotazioni testo + marchi)

Quando la riga target è una C), la A) ha due canali distinti, entrambi allineati per conteggio (§4):

  • Marchi (staccato ., accento >, ecc.) → ancorati alle teste del ritmo accordale (gli slot ritmici), se la C) porta un ritmo esplicito. Resi come segni sopra la testa. È il comportamento storico del ritmo accordale.
  • Annotazioni testo (label, anche con markup, con la cornice di §13.1: "…", ["…"]/[…], ("…")) → ancorate ai token accordo STAMPATI, un token per colonna (i membri di una lista- ritmo compatta come il 2° 4 di A(4,4), e i ghost, non contano: sono esattamente le colonne che il round-trip riemette). La label è resa sopra la sigla; se un token stampato non ha glifo di sigla ma ha una testa-ritmo (il ribattuto !(4)) la label si ancora alla testa, in basso, sopra la nota.

Idioma per-slot. Per mettere un'annotazione (o un marchio) sulla 2ª nota di un ritmo, si usa la forma esplicita con token stampati, non la lista compatta:

A) | "uno" "due" "tre" |
C) | A(4)  !(4)  D      |     // "due" sopra la testa ribattuta (bassa)

Con la lista compatta A(4,4) invece c'è una sola colonna per l'intero gruppo, quindi una sola annotazione testo vi si può ancorare:

A) | "uno" "due" "tre" |
C) | A(4,4)      D      |     // "uno"→A, "due"→D, "tre" ESCE dal flusso (W131)

Principio "quel che vedi round-trippa". Le annotazioni testo si allineano alle sole colonne stampate proprio perché la serializzazione (.nrk) le riemette in quelle stesse posizioni: nessuna modifica a sorpresa dopo un round-trip. Un token testo oltre l'ultima colonna stampata esce dal flusso ed emette W131 (§4).

Estensione a linea tratteggiata. Un'annotazione con un - incollato ("vamp"-) apre una linea tratteggiata di prolungamento che corre alla quota dell'annotazione, sopra la banda accordi, verso destra. Come per le note (§13.3) e per la label inline sulla sigla (CASO 2, neumaRk_chords.md §8.5), ogni colonna coperta dalla linea vuole il suo -: un - standalone su una colonna- accordo successiva la marca come "sotto la linea" — la colonna è consumata (nessuna etichetta, nessun W131: è consumo, non eccesso; come lo slash / = 1 slot). La linea scavalca le colonne di continuazione e si arresta alla prima colonna-terminatore:

  • la prossima sigla stampata non di continuazione,
  • una misura NC (No Chord) o R (rest armonico) — un NC frazionario (neumaRk_chords.md §1.2.1) ricade invece nella regola precedente, essendo una sigla stampata,
  • oppure la fine del rigo/brano.

All'estremo c'è sempre un gancetto in giù (verso il rigo); la linea è centrata verticalmente sul testo. È il gemello sopra-la-banda dell'estensione inline di CASO 2 — che invece flippa la label a destra della sigla: qui la label resta sopra, centrata.

A) | "vamp"- -  -    |
C) | C-7     F7 G7 C |     // linea da "vamp" (su C-7) sopra F7/G7, gancetto su C
A) | "vamp"- |    |     |
C) | C-7     | NC | Bb6 |  // la linea si ferma all'inizio del glifo N.C. (mis. 2)

Ancoraggio a barline. Come per le note (§13.4–13.5), l'estensione chord-ancorata può ancorarsi ai bordi della misura:

  • begin-bar -"vamp" come primo token della A) → la label si ancora al bordo sinistro della misura (non a una sigla) e apre la linea verso destra.
  • terminatore -| come ultimo token (un - incollato al bordo) → chiude la linea aperta sull'end-bar della misura, col gancino, senza testo (gemello di §13.5; -| incollato vs - | spaziato = continuazione).
A) |     | -"fill"- |    |     // begin-bar: label al bordo sx, linea → F7
C) | C-7 |          | F7 |

A) |     | -"fill"- | - -|  |  // terminatore: chiude sull'end-bar della mis. 3
C) | C-7 |          | G7 |  |

Nota. Un "vamp"- come ultimo token resta inline sulla sigla di quella colonna (apertura dell'estensione dalla sigla, come sopra), non un ancoraggio end-bar: per gli accordi l'end-bar testuale che chiude una linea aperta non esiste (si usa il terminatore -| per chiudere sul bordo).

Staffa d'analisi { } (sopra gli accordi). Come per le note (§10.3), i bracket { } sulla riga A) disegnano una staffa d'analisi quadra sopra la campata di accordi: barra orizzontale con gambe in giù verso la banda e una label opzionale "…" sopra a sinistra. { (con label facoltativa) apre la staffa sulla sigla di quella colonna, } la chiude; le colonne intermedie usano . per tenere la posizione (allineamento per-token, §4).

A) {"II-V-I" . } .
C) C-7      F7 G7 C   // staffa "II-V-I" su C-7 F7 G7; C resta fuori

Su più righe. Un ; in un'annotazione o nella label della staffa va a capo (neumaRk_text_markup.md §3bis): la pila cresce verso l'alto e l'ultima riga resta dove sarebbe la riga singola. Un'annotazione sopra un comment-label, o sopra un'altra annotazione della stessa sigla, ne scavalca l'intera pila; la linea tratteggiata di "…"- parte dall'ultima riga, alla sua quota.

A) "solo;chorus" "vamp;on C"- -
C) C-7"drop;2"   F7          G7 C

3. Vocabolario

Ogni token è un simbolo (o combinazione) che mappa a un'articolazione o ornamento. I token sono separati da spazio; più articolazioni sulla stessa nota si scrivono come token unico senza spazi (es. >!).

Token Significato Tipo
_ tenuto articolazione
> accento articolazione
! staccato articolazione
^ marcato articolazione
+ pizzicato (mano sx) articolazione
o fermata (sopra) articolazione
os fermata breve articolazione
ol fermata lunga articolazione
_! portato (tenuto+staccato) combinazione
>! accento staccato combinazione
tr trillo ornamento
m mordente ornamento
M mordente inverso ornamento
t gruppetto ornamento
T gruppetto inverso ornamento
, respiro articolazione
V cesura (Luftpause) flusso (estensione §8+)
h armonico articolazione (estensione §8+)
v arco in su articolazione (estensione §8+)
n arco in giù articolazione (estensione §8+)
. placeholder: nessuna articolazione su quella posizione —

h per l'armonico (il simbolo ° non è ASCII e o è già fermata); v/n per gli archi (n ricorda il ⊓). A questi si aggiungono un token per-coppia (glissato gl, §9) e due span (legatura ( ), onda ~, §10), introdotti dal modello di token decomponibile in §8.

Respiro , vs cesura V. Il respiro , è una breve presa di fiato nel fraseggio: non ferma il metro. La cesura (Luftpause) V è più forte — il flusso musicale si ferma, si aggiunge un silenzio alla durata ordinaria, poi si riprende. Resa: una grande V appena dopo la nota, sovrapposta alla cima del rigo. Maiuscola per non collidere con v (arco in su).

Il vocabolario è l'insieme chiuso della tabella sopra (più il placeholder ., i per-coppia/span delle estensioni §8+). Solo questi token sono articolazioni valide; la classificazione delle righe di articolazione deriva da questo insieme (vedi §6 e §11). Un token fuori dal vocabolario non è un'articolazione valida.

I marcatori > e ^ rendono una riga univocamente articulations in fase di classificazione: nessun'altra riga musicale li usa isolati.

Eccezione — FINE (direttiva di flusso, non articolazione). Il token FINE (tutto maiuscolo) è ammesso sulla riga A) ma non è un'articolazione: è il segno di flusso fine del brano ancorato alla nota (allineato per conteggio come ogni token A)). Usa la riga A) solo come superficie di ancoraggio. Semantica, resa (stesso glifo del FINE su barra, centrato sulla nota) e regola di precedenza col FINE su barra (W167) sono descritte in neumaRk_flow_and_repeats.md §4.2.1.

3.1 Ornamenti cromatici (alterazione dell'ausiliaria)

Un ornamento può eseguire un'ausiliaria alterata anziché la diatonica — p.es. in Do maggiore un mordente superiore su DO che fa DO–RE♭–DO invece di DO–RE–DO. L'alterazione si scrive attaccata al token dell'ornamento.

Alfabeto accidentale (attaccato, subito dopo il segno):

Simbolo Significato
# ## diesis / doppio diesis
b bb bemolle / doppio bemolle
N bequadro (naturale) — maiuscolo (il n minuscolo è arco-in-giù)
- (solo gruppetto) slot senza alterazione

Ornamenti a una sola ausiliaria — m (mordente sup.), M (mordente inf.), tr (trillo): un solo accidentale opzionale; il lato (sopra/sotto) è implicito nel segno.

Scrivi Esegue (in Do magg.)
mb DO–RE♭–DO
m# DO–RE♯–DO
mN DO–RE♮–DO (forza il naturale contro l'armatura)
M# mordente inferiore con ausiliaria ♯
tr# trillo con ausiliaria ♯

Gruppetto — t (turn), T (inverso): due ausiliarie, quindi fino a due slot in ordine di esecuzione, con - = slot senza alterazione. Un solo accidentale si applica alla prima ausiliaria eseguita.

  • t esegue superiore → inferiore ⇒ slot1 = sopra, slot2 = sotto.
  • T esegue inferiore → superiore ⇒ slot1 = sotto, slot2 = sopra.
Scrivi Effetto
t# solo ausiliaria superiore ♯
t-# solo ausiliaria inferiore ♯
t#b superiore ♯, inferiore ♭
T#b inverso: inferiore ♯, superiore ♭
tNb superiore ♮, inferiore ♭

L'accidentale non impedisce la co-locazione con altre articolazioni (mb> = mordente-sup-♭ + accento). Un accidentale in eccesso o mal posto (m#b, t#b#) ricade fuori vocabolario → W139 (non bloccante). Reso via i glifi accidentali standard sopra/sotto il segno; nessun font dedicato.

4. Allineamento count-based

La corrispondenza con gli eventi della riga target è strettamente posizionale per conteggio (come neumaRk_dynamics.md §4.1), left-to-right:

A) | >  .  !  ^ |
N) | a8 b  c  d |
//   ↑      ↑  ↑
// accento staccato marcato (b: nessuna)

Ordine delle righe. Una A) lega sempre alla riga note/accordi immediatamente sotto di sé (a differenza di D)/L), che legano alla riga sopra). Va quindi scritta sopra la N)/C) cui si riferisce.

  • Il token . o un token vuoto = nessuna articolazione su quella nota.
  • Se i token sono meno delle note, le note residue restano senza articolazione (no-op).
  • Se i token sono più degli eventi, gli extra sono ignorati (filosofia auto-fix) e A) emette W131 (eccesso di token), come D) (§7).
  • L'allineamento conta anche i rest (a differenza di L), che li salta): una posizione sopra un rest è un evento a tutti gli effetti. È ciò che permette a uno span (§10) di coprire un rest (vi si scrive ~ e lo span prosegue).

5. Esempi

A) | >    !  |
N) | c4 d e f |     // accento su c, staccato su e

A) | >!         |
C) | C7  F7     |     // accento-staccato sul primo evento di chord-rhythm (stave 0)

6. Il vocabolario: insieme chiuso e fonte unica

Questo documento è la fonte unica per le articolazioni. Definisce ogni token-NRK → significato musicale (es. ! → staccato); il significato è normativo, mentre il modo in cui un renderer lo disegna non lo è (un altro renderer può scegliere glifi diversi).

Il vocabolario è un insieme chiuso: i simboli fuori dalla tabella §3 (per esempio _ o lettere isolate) non sono articolazioni valide. Partecipa anche alla deduzione del tipo di riga: una riga prefix-less è classificata A) riconoscendone i token contro questo vocabolario.

7. Decisioni

  1. Fonte unica — la spec è normativa; il charset di classificazione e la mappa dei glifi di un renderer derivano entrambi dalla tabella §6.
  2. Vocabolario chiuso — i simboli fuori tabella (es. _, lettere isolate) non sono articolazioni valide (vedi §6).
  3. Eccesso di token — A) emette W131, come D).
  4. Significato normativo, rendering no — il significato musicale di ogni token è vincolante; il glifo che un renderer usa è una scelta implementativa.

Diagnostica: un token che porta materiale oltre il vocabolario emette W131 (eccesso di token); un token con una sequenza fuori-vocabolario emette W139 (validazione lessicale), inclusa una lettera-frammento isolata come la s di os o la r di tr.


Estensioni A)

Le sezioni §8-§12 sono normative. Estendono il vocabolario per-posizione di §3 con: un modello di token decomponibile (§8), un token per-coppia (glissato gl, §9) e due span (§10).

8. Modello del token: decomposizione e co-locazioni

Il vocabolario base (§3) può essere riconosciuto come token interi. Le estensioni richiedono un vero decompositore per-posizione, come quello che D) usa per le sue dinamiche (vedi neumaRk_dynamics.md).

Ogni posizione (token separato da spazi) è una concatenazione order-free di elementi, decomposta con greedy longest-match sugli atomi multi-char (prima os/ol di o, prima tr di t):

elemento :=
  | onda            ~[1-4]? "…"?         // §10.2 (cifra/etichetta solo in apertura)
  | testo           "…" | ["…"] | […] | ("…")   // §13.1 (modello a cornice)
  | legatura-apre   (                    // §10.1 (ma `("…")` esatta è testo)
  | legatura-chiude )                    // §10.1
  | staffa-apre     { "…"?               // §10.3 (etichetta solo in apertura)
  | staffa-chiude   }                    // §10.3
  | ottava-apre     8u | 8d              // §10.4 (alta / bassa)
  | ottava-chiude   8.                   // §10.4 (8 + punto)
  | glissato        gl                   // §9 (verso la nota successiva)
  | fermata         o | os | ol          // greedy: os/ol prima di o
  | trillo          tr                   // greedy: tr prima di t
  | gruppetto       t | T
  | mordente        m | M
  | per-nota 1ch    _ > ! ^ + , h v n V   // V = cesura/Luftpause (§3)
  | linea           -                    // §13.3 (continuazione della linea tratteggiata)
  | placeholder     .                    // nessun elemento su quella posizione

Token interi fuori dal decompositore. FINE (direttiva di flusso su A), §4.2.1 di neumaRk_flow_and_repeats.md) non è un elemento per-posizione: è un token intero gestito prima del decompositore. V (cesura) è invece un elemento per-posizione a un carattere, come >/^.

Conseguenza: _! e >! sono co-locazioni, non token atomici (_+! = portato; >+! = accento-staccato). Tutte le combinazioni emergono dalla concatenazione: (! = legatura-apre + staccato; >gl = accento + glissato. La voce "combinazione" della tabella §3 resta valida come significato, non come token atomico.

Eccezione: i delimitatori di span sono ordinati. Fra gli elementi che aprono e chiudono uno span delimitato (( ) §10.1, { } §10.3, 8u/8d 8. §10.4) conta l'ordine in cui compaiono nella posizione:

  • chiusura poi apertura = concatenazione: la nota chiude uno span e ne apre un altro dello stesso tipo ()(, }{, 8.8u);
  • apertura poi chiusura = degenere ((), {}, 8u8.): → warning, vedi le singole sezioni.
A) ( . )( . )
N) c d e  f g      // due legature: c→e ed e→g

I segni per-nota restano order-free, anche rispetto ai delimitatori: !)(, )(! e )!( si equivalgono.

Decomporre una posizione nei suoi segni per-nota è un passo separato dalla risoluzione degli span che apre o chiude (§10) — la stessa separazione che D) applica alle sue dinamiche e forcelle.

9. Glissato fra note (gl)

gl sulla posizione di una nota = quella nota glissa verso la successiva. La direzione (su/giù) è implicita dalle due altezze. È per-coppia, non uno span.

A) .  gl .  .
N) r4 a  b  r       // a glissa verso b

Distinto dal glissato di singola nota (scoop/fall, entrata/uscita da una nota), che vive in N) come modificatore fra parentesi — vedi neumaRk_notes_and_durations.md (estensioni N).

10. Span

Span mutuati dal modello di D) (apertura/chiusura risolte in un post-pass).

Uno span vive sul rigo logico: lo stesso rigo attraverso tutti i datapack, secondo l'identità di neumaRk_datapack.md §4.5. Il cambio di datapack o di sistema non lo interrompe; lo chiude la sua chiusura. Uno span delimitato ({ }, 8u…8.) mai chiuso → warning, e si ferma sull'ultima nota del sistema in cui si apre (il suo datapack). Fa eccezione la legatura ( ): una ( senza chiusura è lecita e arriva sulla nota successiva (§10.1). Gli span si risolvono per voce: una A) nel gruppo di N2 (neumaRk_voices.md §3.1) apre e chiude span sulle note della voce 2, indipendenti da quelli della voce 1 (una ( della voce 1 non si chiude su una ) della voce 2).

10.1 Legatura di portamento ( ) (span delimitato)

Stile LilyPond: ( apre sulla nota della sua posizione, ) chiude sulla nota della sua posizione; la curva copre dall'apertura alla chiusura.

A) . ( . . )
N) c d e f g      // legatura da d a g
  • Cross-barline / cross-system: sì. Sul cambio di sistema la curva si spezza in due archi: uno esce dal fondo del primo sistema, l'altro entra all'inizio del successivo.
A) | . . ( . |
N) | c d e f |

A) | . ) . . |
N) | g a b c |      // legatura da e a a, attraverso il cambio di sistema
  • Frasi concatenate: )( sulla stessa nota chiude una legatura e ne apre un'altra (§8, delimitatori ordinati).
  • ( senza ): legatura all'elemento successivo (lecita, nessun warning). Una ( a cui non segue una ) prima della ( successiva della stessa voce (o prima della fine del brano) arriva sull'elemento successivo scritto nel sorgente: la nota dopo quella dell'apertura. È la legatura di due note, la più frequente, scritta con un solo segno:
A) !    (  !  (  !  (  !  (  | !
N) a8 b c d e d c b | a      // quattro legature di due note: b-c, d-e, d-c, b-a

L'elemento successivo si conta sul sorgente: una nota che il renderer spezza per la leggibilità (puntata sul battere, attraverso la stanghetta) è un elemento solo, le grace note non contano (stanno sulla nota principale), la nota d'arrivo di una legatura di valore ^ sì (è scritta). Non contano nemmeno il prolungamento . di N) (allunga la nota prima: in c4 . d la legatura va da c a d) né le pause che il parser aggiunge per completare una misura corta; lo slash / conta, come una nota. Vale anche attraverso la stanghetta e il cambio di sistema (§10: lo span vive sul rigo logico). Se l'elemento successivo è una pausa → warning (W144.slur_unclosed_rest) e nessuna legatura: una legatura che arriva su una pausa non è notazione, è quasi sempre una chiusura dimenticata. Una ( sull'ultima nota del rigo logico, senza niente dopo → warning (W144.slur_unclosed_eol) e nessuna legatura. - Una legatura per volta, per scelta: annidamento e sovrapposizione non fanno parte della notazione. Sono l'1% dei casi reali, e distinguere due legature aperte richiederebbe un identificativo per ciascuna. Per questo una ( con una legatura già aperta non la sovrappone: la legatura aperta diventa di due note (regola sopra) e la nuova ( apre la sua. ( ( . ) sono quindi due legature, dalla 1ª alla 2ª nota e dalla 2ª alla 4ª; in ( ( . ) ) la seconda ) resta orfana. Due ( sulla stessa nota → warning (W144.slur_open_overlap), la seconda è ignorata. - ) orfana → warning (W144.slur_close_unmatched), ignorata. - Apertura+chiusura sulla stessa nota (()): degenere → warning (W144.slur_degenerate), ignorata. - Co-locabile coi per-nota: (! = legatura-apre + staccato.

10.2 Onda ~[1-4] (span per ripetizione)

Una linea ondulata sempre sopra il rigo. Unifica vibrato / shake / long-vibrato / laid-back: l'ampiezza è la larghezza visiva, l'etichetta ne dà il nome.

Ampiezza — cifra opzionale 1–4 (default ~ = livello 1):

  • ~N (con cifra) apre un nuovo span di ampiezza N, chiudendo quello corrente;
  • ~ (nudo) estende lo span corrente; se nessuno è aperto, ne apre uno di livello 1.
A) ~3 ~ ~ ~1 ~ ~      // onda grande su 3 note, poi onda piccola su 3

Estensione e rest: ~ consecutivi (anche cross-barline) = un'unica onda; una posizione senza ~ (inclusa una misura vuota) chiude lo span. I rest non interrompono (l'allineamento conta i rest, §4).

A) ~2 ~ ~ ~ |   | ~3 ~ ~ ~
N) a4 b r c | d | a4 b r c
//  └─ ampiezza-2 su a b r(rest) c ─┘  (mis.2 vuota → niente onda)  └─ ampiezza-3 ─┘

Etichetta (opzionale, solo sul token di apertura): "…" subito dopo l'onda, resa sopra il suo inizio. L'etichetta è un container di text markup (neumaRk_text_markup.md §2.2): accetta i marcatori #/##/###, */**, __; il default è tondo (corsivo/grassetto/underline/size solo via i marcatori). Ampiezza ed etichetta sono indipendenti.

A) ~3"shake" ~ ~ ~
A) ~"vibrato" ~ ~
A) ~4"laid back" ~ ~ ~ ~

L'etichetta dà la semantica (vibrato vs shake vs laid-back); il glifo ~ da solo è solo "onda di ampiezza N". Per uno strumento di trascrizione la pagina è la verità; un eventuale interprete inferirà da etichetta/ampiezza.

10.3 Staffa d'analisi { } (span delimitato)

Una staffa di raggruppamento sopra il rigo, come le parentesi dell'analisi formale. { apre sulla nota della sua posizione, } chiude su quella della sua (stile LilyPond, esattamente come la legatura §10.1).

A) . . {"triade di DO" . | } |
N) a a c            e | g e c a
  • Etichetta (opzionale): stringa "…" subito dopo { (riusa lo stesso token opaco dell'onda). Resa allineata a sinistra sopra l'apertura ed è un container di text markup (neumaRk_text_markup.md §2.2: #/*/__), tonda di default. Una staffa senza etichetta ({ … }) è ammessa.
  • Resa: parentesi quadra sempre sopra il rigo, con i due montanti rivolti verso il basso (verso le note).
  • Cross-barline / cross-system: sì.
  • Una staffa per volta, per scelta (come la legatura, §10.1, ma senza la sua legatura di due note: la staffa non ha un idioma «su due note»): una seconda { con una aperta → warning (W144.brace_open_overlap), ignorata insieme alla } che la chiude, e resta la staffa esterna; una } orfana → warning (W144.brace_close_unmatched); {} degenere (apertura+chiusura sulla stessa nota) → warning (W144.brace_degenerate); staffa mai chiusa → warning (W144.brace_unclosed_eol) e chiusura implicita sull'ultima nota del sistema in cui si apre.
  • Puramente grafica: nessun effetto sul contenuto musicale (è un'annotazione analitica).
  • Nota di sintassi: nelle righe A) un { … | … } è una staffa che attraversa la barra, quindi il | interno è una barline reale. La mappa sopprime il rilevamento polychord sulle righe Articulations.

10.4 Ottava 8u / 8d … 8 (span delimitato)

Una linea di ottava. 8u apre un'ottava alta, 8d un'ottava bassa; 8. chiude lo span (inclusivo sull'ultima nota coperta). Delimitata come la legatura (§10.1) — volutamente NON il modello a estensione dell'onda (§10.2): la linea d'ottava è rada, ripetere un token su ogni nota sarebbe macchinoso. Un 8 nudo (senza u/d/.) è fuori-vocabolario (probabile refuso di 8.) → W139.

A) . . . . . . . 8u | . . . 8. |
N) c8 d e f g a b c  | d e f e d c b a
//                 └─ 8va dall'8ª nota, attraverso la barra, fino alla chiusura ─┘
  • Resa: la sigla SMuFL standard — 8va (alta) / ottava bassa (la grafia visibile, «8ba» o «8vb», dipende dal font) — seguita da una linea orizzontale tratteggiata e un gancio finale verso il rigo; sopra per 8u, sotto per 8d. (Resa di riferimento, informativa: glifi U+E511 e U+E513 ottavaBassaBa, nel subset BravuraLS/PetalumaLS.)
  • Altezza effettiva: le note coperte valgono ±12 semitoni (8u = +12, 8d = −12) rispetto all'altezza scritta, che resta invariata — le teste-nota non si muovono. È il senso stesso dell'ottava: si scrive in una posizione, si legge un'ottava sopra/sotto.
  • Cross-barline / cross-system: sì.
  • Un'ottava per volta, per scelta (come la legatura, §10.1, ma senza la sua legatura di due note: un 8u senza 8. è una chiusura dimenticata, e cambia l'altezza effettiva): seconda apertura con una aperta → warning (W144.octave_open_overlap), ignorata insieme all'8. che la chiude, e resta l'ottava esterna; 8. di chiusura orfano → warning (W144.octave_close_unmatched); 8u8. degenere → warning (W144.octave_degenerate); ottava mai chiusa → warning (W144.octave_unclosed_eol) e chiusura implicita sull'ultima nota del sistema in cui si apre.

Convenzione span (decisa per A), da riusare per le forcelle/cresc. di D)): ogni span lungo è delimitato — un token di apertura (eventualmente parametrizzato) + un token di chiusura; le posizioni intermedie sono placeholder .. Legatura ( ), staffa { } e ottava 8u…8 la seguono. L'onda ~ mantiene il modello a estensione come unica eccezione documentata, perché il suo glifo è una linea ondulata continua su ogni nota.

11. Impatto sulla deduzione (charset esteso)

Le estensioni allargano la superficie di classificazione delle righe (neumaRk_datapack.md §3.bis):

  • Charset A): include i nuovi simboli ( ) ~ h v n g l V e le cifre 1-4, più { } 8 u d (§10.3 staffa, §10.4 ottava), oltre al vocabolario base §6 (da cui il charset è derivato — fonte unica). Nota: l compare in gl/ol; V è la cesura (§3). [ ] è il riquadro ["testo"] (§13.1) e ("testo") la cornice tonda (§13.1); la staffa d'analisi usa { }.
  • ~ è marker specifico: una riga che contiene ~ è classificata univocamente come A), malgrado le cifre che altrimenti la avvicinerebbero a chords/notes.
  • { } 8 d NON sono marker specifici: 8/d = durata/nota. Allargano solo il charset A); la priorità notes-line (TB4) protegge le righe N), e una riga staffa/ottava implicita richiede il prefix esplicito A) per essere classificata come articolazioni.
  • g/gl vs nota G — TB4: g (testa del token gl glissato, §9) è anche la nota G, e con le durate 1–4 rende ambigue righe come g, g4, g g g. La regola TB4 (neumaRk_datapack.md §3.bis.5) dà priorità alle note: una riga che è una notes-line valida (ogni token matcha la grammatica canonica delle note
  • almeno un pitch reale) è N), non A). Il token gl non è una nota valida, quindi una riga di articolazioni con gl resta A).
  • Quote-aware: il contenuto di un'etichetta "…" (es. shake) è escluso dal match di classificazione — lettere fuori-charset o un ~ dentro il testo non rompono né marcano falsamente la riga.

12. Decisioni (estensioni)

  1. Glissato fra-note (gl, §9) ≠ glissato singola-nota (scoop/fall, in N)). ✓
  2. Vocabolario esteso = insieme chiuso; significato normativo, il rendering è una scelta implementativa (eredita §6/§7). ✓
  3. Modello token unificato (decompositore + co-locazioni, §8); order-free tranne i delimitatori di span, dove chiusura-poi-apertura = concatenazione. ✓
  4. Legatura ( ) delimitata, cross-system, concatenabile con )(; una per volta per scelta dichiarata, non per rinvio: la ( in eccesso si ignora con la sua ) (§10.1). ✓
  5. Arco su v, giù n; armonico h (§3). ✓
  6. Onda ~: livelli 1–4; cifra = nuovo span, nudo = estende; sempre sopra; copre i rest; etichetta "…" in apertura, tonda (§10.2). ✓
  7. Shake / long-vibrato / laid-back unificati nell'onda ~N + etichetta. ✓
  8. Staffa d'analisi { } delimitata, etichetta "…" opzionale, sempre sopra, puramente grafica; una per volta per scelta, come la legatura (§10.3). ✓
  9. Ottava 8u/8d … 8. delimitata (8. chiude), tratteggiata sopra/ sotto, altezza effettiva ±12; una per volta per scelta, come la legatura (§10.4). ✓
  10. Convenzione span: gli span lunghi sono delimitati (apertura + chiusura); l'onda è l'unica eccezione (estensione), avendo un glifo a linea continua. ✓

Linea-di-testo A) (unificata con D))

Sezione normativa. Porta su A) (sopra il rigo) la scritta libera con linea tratteggiata che D) ha già sotto il rigo (neumaRk_dynamics.md §5–§6), con vocabolario identico. A) sopra, D) sotto: stessi token. («Identico» si riferisce al sotto-vocabolario testo + ancoraggi di §13.1: gli hairpin grafici </> di D) non valgono in A), dove > è l'accento, §3.) È il ruolo idiomatico Sher di "dr. fill ----|", "rhythm tacet ----|". In A) il tenuto è _ (§3), quindi - è libero per questo ruolo.

13. Etichette testuali e linea tratteggiata

Oltre alle articolazioni per-posizione (§3) e agli span geometrici (§10), A) ospita testi liberi ancorabili a nota o a barline, resi con una linea tratteggiata di prolungamento. Il modello è il gemello sopra-il-rigo delle annotation testuali di D): le regole di apertura, continuazione, chiusura e ancoraggio barline sono le stesse di neumaRk_dynamics.md §5–§6; qui si elencano il vocabolario, le specificità di A) e il terminatore -| (nuovo, comune ad A) e D)).

13.1 Vocabolario (identico a D))

Forma Ruolo Rif. D)
"text" / ["text"] / ("text") annotazione testuale note-anchored (cornice: §13.1 sotto) §3.4
"text"- (non ultimo token) apre la linea tratteggiata §5.2
- standalone (spaziato) continua la linea, attraversa le barre §5.3
-"text" (primo token) ancora a begin-bar §6.2
"text"- (ultimo token) ancora a end-bar §6.3
-"text"- (primo token) begin-bar + apre linea cross-bar §6.4
-\| (ultimo, incollato al bordo) terminatore: chiude sulla end-bar, gancetto, senza testo §13.5

L'etichetta è un container di text markup (neumaRk_text_markup.md §2.2, #/*/__), carattere tondo di default — come le etichette di onda/staffa (§10.2, §10.3). Segue il modello a cornice (neumaRk_text_markup.md §2.1), in ogni posizione della tabella (nota, begin-bar, end-bar, con o senza linea):

  • "text" — nessuna cornice;
  • ["text"] — riquadro (forma di riferimento); [text] ne è l'abbreviazione, con lo stesso risultato. In A) la staffa d'analisi usa { } (§10.3), quindi [ ] è disponibile per il riquadro;
  • ("text") — cornice tonda. Solo la forma esatta: ("dolce" … ) resta una legatura (§10.1) che parte con un testo.

Le co-locazioni sono quelle di §8: ("x")- apre la linea, -("x")- apre dalla begin-bar, ("x")! e >("x") affiancano un per-nota. Le stesse forme valgono per il testo di A) sopra una riga C) (§2.1).

13.2 Annotazione note-anchored

"text" (o ["text"], ("text") con cornice) su una posizione = etichetta ancorata a quella nota, allineata a sinistra sopra di essa. È puntuale finché non è seguita da - adiacente (§13.3).

A) "dr. fill" . . .
N) a8 b c d          // etichetta "dr. fill" sopra la 1ª nota

13.3 Linea tratteggiata (nota → nota)

Le stesse tre regole di neumaRk_dynamics.md §5: un - adiacente (incollato) apre la linea; un - standalone (spaziato) la continua, anche attraverso le barre (§5.3, §5.5); un nuovo elemento senza - — o la fine del system — la chiude (§5.4). La linea copre le note percorse dalle continuazioni e si arresta appena prima dell'onset dell'evento di chiusura.

A) "dr. fill"- - - .
N) a8 b c d          // linea tratteggiata da nota 1 a nota 4, gancetto sull'ultima

13.4 Ancoraggio a barline

Identico a neumaRk_dynamics.md §6: -"text" come primo token della misura ancora a begin-bar; "text"- come ultimo token ancora a end-bar; -"text"- apre una linea cross-bar. Il contenuto di A) per ciascuna misura è il testo fra due barline, escluso ogni decoratore del bordo (§6.1): il bordo composto è proprietà della riga, comune a tutte le righe musicali, e non va replicato.

A) -"vamp"- - |  |
N) a1     | b1 |     // begin-bar "vamp", cross-bar, chiude sulla 1ª nota della misura 2

Vale anche la riclassificazione "text"- che apre (gemella di neumaRk_dynamics.md §6.4): un "text"- ultimo-token, se nessuna linea è aperta e la misura seguente continua, apre una linea cross-bar riclassificata come apertura note-anchored sull'ultimo evento della misura (rende sulla nota — es. il primo slash — non al bordo). Es. A) | . "riff"- | - mette "riff" sul primo slash.

13.5 Terminatore -|

Il terminatore -| chiude la linea sulla barline, senza testo (neumaRk_dynamics.md §2), a differenza della chiusura su nota (§13.3). Il terminatore è un - incollato a un bordo composto come ultimo token della misura:

A) -"vamp"- - | - -|
N) a1     | b1  |     // la linea chiude sull'end-bar della misura 2, gancetto sul bordo
  • Prefisso dell'intero bordo, uniforme (nessun caso speciale per decoratore): -|, -:|, -:open|, -:x3|, -||, -|., -DCal@| → il parser stacca il - iniziale (= "chiudi span + gancetto"), il resto è il normale bordo.
  • Discriminatore incollato/spaziato: -| (incollato) aggancia il bordo; - | (spaziato) è un - di continuazione che attraversa la barra.
  • Vale anche per D) (stessa forma, stesso effetto: neumaRk_dynamics.md §6.6).

13.6 Resa

Etichetta allineata a sinistra; linea tratteggiata che parte dopo il testo; gancetto SEMPRE all'estremo, rivolto verso il rigo — in giù per A) (che è sopra), in su per D) (che è sotto). È lo stesso primitivo grafico dell'ottava (§10.4, tratteggio + hook). Il terminatore estende la linea fino al bordo destro del rigo, con gancetto sull'end-bar. La linea è centrata verticalmente sull'altezza del testo. A) e D) sono speculari.

Su più righe. Un ; nell'etichetta va a capo (neumaRk_text_markup.md §3bis), anche nelle etichette di onda (§10.2) e staffa (§10.3): la pila cresce verso l'alto e l'ultima riga resta dove sarebbe la riga singola. Righe a sinistra, a destra solo sulla stanghetta di fine misura ("…"- ultimo token); una sola cornice (riquadro o tonda) avvolge l'intera pila; la linea tratteggiata parte dall'ultima riga, alla sua quota. Una sigla sopra la nota annotata sale sopra l'intera pila.

A) "rit.;poco a poco"- - - - | - - - . |
N) c4 d e f                  | g a b c |

13.7 ⚠ Authoring: ogni nota vuole la sua continuazione

Il begin-bar -"text"- apre soltanto la linea: non copre automaticamente le note della misura. Come in D), ogni nota sotto la linea vuole la sua continuazione - nella propria colonna. Le conseguenze, verificate col parser:

  • Una nota senza token A) è un evento di chiusura: la linea finisce appena prima del suo onset.
  • Le continuazioni attraversano le barre senza sintassi speciale (§5.5); per prolungare la linea oltre la misura basta continuare a mettere - colonna per colonna.
  • Un - standalone in una misura nuova senza span aperto è orfano: non riapre nulla.

Ricette corrette (verificate; whole/half note, 1–2 note per misura):

// (a) chiude su nota — cross-bar
A) -"vamp"- - |  |
N) a1     | b1 |          // → linea da begin-bar della mis.1 alla 1ª nota della mis.2

// (b) chiude su barline — terminatore
A) -"vamp"- - | - -|
N) a1     | b1  |         // → linea da begin-bar della mis.1 all'end-bar della mis.2

Confusione tipica (da evitare): aprire con -"text"- senza continuazioni che coprano la misura, e mettere un - isolato nella misura dopo:

A) -"vamp"- | - |
N) a1      | b1 |         // ✗ la linea si chiude subito sulla 1ª nota della mis.1;
                          //   il `-` della mis.2 resta orfano (non riapre nulla)

13.8 - è continuazione di linea (non tenuto)

In A) il - è la continuazione della linea (§13.3); il tenuto è _ e il portato _! (§3). Lo staccato ! e l'accento-staccato >! sono invariati.

13.9 Decisioni (linea-di-testo)

  1. Modello unificato A) = D): stesso vocabolario, A) sopra e D) sotto, rese speculari (§13.1, §13.6). ✓
  2. Terminatore -| = prefisso dell'intero bordo composto, uniforme, comune ad A) e D); colma il buco end-bar (§13.5). ✓
  3. Ogni nota vuole la sua continuazione -; nota senza token = chiusura; - orfano non riapre (§13.7). ✓
  4. Box ["text"] in A) usa le parentesi quadre (la staffa d'analisi usa { }, §10.3). ✓

14. Diagnostici

Codice Condizione
W131 Token in eccesso rispetto agli eventi della riga sotto (W131.excess_articulation); sopra C), testo oltre le colonne di sigla stampate (§2.1, §4)
W133 Container di testo non chiuso nella misura: il resto della misura è letto come testo (neumaRk_text_markup.md §6.2)
W139 Token fuori dal vocabolario, compreso un 8 nudo (§3, §10.4)
W144 Span malformato: legatura (slur_*), staffa d'analisi (brace_*), ottava (octave_*) (§10.1, §10.3, §10.4)
W167 FINE ancorato a una nota in conflitto con FINE sulla stanghetta (neumaRk_flow_and_repeats.md §4.2.1)
W174 Riga A) senza la sua riga sotto: ignorata (§2)