Vai al contenuto

Accordi

Questo documento definisce la sintassi e la semantica degli accordi in neumaRk, inclusi:

  • dizionario delle sigle ammesse
  • normalizzazione delle varianti
  • gestione del basso
  • ritmo degli accordi (implicito, esplicito, misto)
  • accordi opzionali
  • polyaccordi (polychord)

Gli accordi sono contenuti nelle righe C) e possono essere utilizzati per determinare sia l'armonia che il suo aspetto ritmico.


1. Evento accordo

Un evento accordo è un’unità armonica che può avere:

  • una sigla di accordo
  • un basso opzionale, oppure solo un basso
  • una durata (implicita o esplicita)
  • modificatori di durata

Un evento accordo può anche rappresentare:

  • una pausa (r)
  • un ribattuto (!)
  • un polyaccordo (due sigle sovrapposte verticalmente, vedi §6)

Ogni evento accordo in neumaRk è un’entità ritmica autonoma, con durata implicita o esplicita.

Un accordo può includere un basso esplicito nella forma di slash chord (es. A/B), oppure consistere esclusivamente di un basso (es. /B).

In entrambi i casi, l’evento è soggetto alle stesse regole ritmiche degli altri accordi.

1.1 Persistenza dell’armonia (cella vuota)

Una misura di accordi vuota — priva di sigle, di % e del token NC (§1.2) — non rappresenta un vuoto armonico: l’armonia della misura precedente persiste. Il contenuto armonico vigente viene ri-realizzato sul battere della misura vuota (ri-attacco, con la stessa logica di %), non sostenuto come una legatura.

La persistenza:

  • si propaga su più misure vuote consecutive;
  • attraversa i confini di datapack, coerentemente col contesto musicale persistente (neumaRk_specification.md);
  • si interrompe su un evento NC (§1.2) e riprende solo dal successivo accordo esplicito.
C) C |   |   F

Le misure 1 e 2 suonano C; la misura 3 suona F. Sopra le misure persistenti non viene disegnato alcun glifo: il rigo accordi resta pulito.

Resa sul rigo di note. Se la riga N) di una misura persistente è vuota, la misura è resa in slash notation (c’è armonia attiva da accompagnare): vedi neumaRk_notes_and_durations.md §10 → Slash notation.

1.1.1 Continuazione parziale (. iniziale)

Quando una misura inizia con un punto . (prima di qualsiasi sigla), il punto è una continuazione dell’armonia persistente: ri-attacca l’armonia vigente (§1.1) solo per il proprio slot, lasciando il resto della misura agli accordi che seguono. È l’estensione, a livello di slot, della persistenza di cella vuota. (Distinto dal . che segue un accordo nella stessa misura, che ne prolunga la durata: vedi §4.)

C) A7 DM |   | . GM

Nella misura 3 il primo tempo continua DM — l’armonia attiva, ereditata dalla misura 1 attraverso la cella vuota della misura 2 — e il secondo tempo suona GM. In playback equivale a A7 DM | DM | DM GM.

Più punti iniziali (. .) estendono la continuazione su più slot. Se l’armonia non è attiva (inizio del brano, o dopo NC), un . iniziale resta muto. Sul rigo accordi il punto di continuazione non disegna alcun glifo.

1.2 Assenza di accordo (NC)

Il token NC (due lettere maiuscole, senza punti) dichiara l’assenza di armonia: interrompe la persistenza (§1.1) e indica che in quella misura non suona alcun accordo.

  • occupa l’intera misura ed è l’unico contenuto della sua cella; non è miscelabile con sigle o durate (C NC → errore E128);
  • in playback è muto (nessun accordo realizzato);
  • è renderizzato sul rigo accordi con il glifo dedicato N.C. (codepoint riservato U+EFB2 dei font BravuraLS/PetalumaLS);
  • se la riga N) corrispondente è vuota, la misura non riceve slash notation ma una pausa (non c’è armonia da accompagnare).
C) C |  NC |  F

La misura 1 suona C; la misura 2 è muta (con N.C. disegnato); la misura 3 suona F. Dopo un NC, una cella vuota resta muta finché non compare un nuovo accordo esplicito.


2. Sigla di accordo

2.1 Struttura generale

La forma generale di una sigla è:

<root><quality>[<extensions>][/<bass>]

Dove:

  • root{A B C D E F G} con alterazioni opzionali # o b (massimo un'alterazione)
  • suffix identifica il suffisso dell'accordo
  • bass opzionale, indica un basso differente dalla root

Esempi:

C   Dm  GM  F#7alt   BbM13   C7/E

3. Dizionario degli accordi

3.1 Triadi

Input ammessi Normalizzazione
C C
Cm, C- C-
Co, Cdim
C+, C5+, Caug Caug
Csus2 Csus2
Csus4 Csus4

3.2 Accordi maggiori (4 o più suoni)

Input ammessi Normalizzazione
C6 C6
C69 C69
CM, CM7, CMaj7, Cmaj7, C7M
CM9, Cmaj9 CΔ9
CM13, Cmaj13 CΔ13
CM#11, CM7#11, Cmaj#11 CΔ#11
CM9#11 CΔ9#11
CM13#11 CΔ13#11
CM+, CM#5, CM7#5, C+M7 CΔ#5

3.3 Accordi minori

Input ammessi Normalizzazione
C-b6, Cmb6 C-b6
C-6, Cm6, C-69, Cm69 C-6
C-7, Cm7 C-7
C-9, Cm9 C-9
C-11, Cm11 C-11
C-13, Cm13 C-13
C-M, CmM, C-M7, CmM7 C-M

3.4 Accordi di dominante

Input ammessi Normalizzazione
C7 C7
C9 C9
C13 C13
C7#11, C9#11, C13#11, C7b5 C7#11
C7b9 C7b9
C7alt C7alt
C7#5, C+7 C7#5
C7#9 C7#9
C13b9 C13b9
C7sus, C9sus, C13sus C7sus
C7susb9 C7susb9

3.5 Accordi diminuiti e semidiminuiti

Input ammessi Normalizzazione
Co7, Cdim7 C°7
CoM7, CdimM7, CoM C°M
Cm7b5, Ch

3.6 Suffissi fuori dizionario

Il dizionario (§3.1–§3.5) è l'insieme dei suffissi riconosciuti. Le grafie della settima maggiore maj/Maj (Cmaj7, Cmaj9, Cmaj#11, …) e il 7 ridondante (M7/7M) sono canonicalizzate alla forma M (§3.2) — riconosciute, non warning. Un suffisso davvero fuori dizionario (es. dom7) non rende il documento non valido: la sigla viene conservata (root + eventuale basso) ma il suffisso non ha resa significativa, e il parser emette il warning non-bloccante W103 (unrecognized chord suffix). Si tratta di un degrado best-effort, non di un errore: il flusso di parsing prosegue.


4. Ritmo degli accordi

N.B.

Il significato del punto (.) è specifico del contesto delle righe di accordi e non coincide con quello utilizzato nelle righe di note. Il carattere punto assume significati differenti a seconda della sua posizione distanziata dall'evento accordo o inserita nel contesto di durata.

4.1 Modalità implicita

In assenza di durate esplicite, il ritmo degli accordi è dedotto.

Principio:

  • gli eventi accordo in una misura sono contati
  • la durata della misura è suddivisa equamente
  • il punto (.) prolunga l’accordo della sua stessa durata

Esempi in 4/4:

| C Dm |
| C . . Dm |
| r C . Dm . D#o . Em |

In modalità implicita il ritmo non viene visualizzato, ma serve per l’allineamento.


4.2 Modalità esplicita

La durata di un accordo può essere indicata fra parentesi tonde:

C(4)   Dm(8.)   G7(8t)

La durata può contenere:

  • valore della nota (obbligatorio)
  • punti (.), modalità standard, aggiungono la metà del valore
  • t per terzina (tuplet 3:2)
  • moltiplicatori (*n)

Simboli speciali:

  • r → pausa
  • ! → ribattuto (ripete la durata, non la sigla)

Per l’ultimo accordo della misura, ^ crea una legatura verso la misura successiva.

Con questa modalità di notazione, il ritmo degli accordi viene notato sopra al pentagramma.


4.3 Modalità mista

È possibile combinare modalità implicita ed esplicita nella stessa misura.

  • solo le durate esplicite vengono visualizzate
  • le altre sono dedotte
C   Dm(8^)

La pausa r segue le stesse regole di un accordo, sia per la deduzione del ritmo sia per la visualizzazione:

  • r (senza parentesi) è implicita: concorre alla deduzione come qualunque altro evento (la durata della misura, sottratte le durate esplicite, è suddivisa equamente fra gli eventi impliciti, considerando anche i punti .) e non viene disegnata nel rhythm-row;
  • r(...) (con parentesi) è esplicita e viene disegnata come pausa visibile sopra al pentagramma.

Esempio — anticipo di croma su misura altrimenti vuota:

r EbM(8^) | EbM

rende solo l'ottava di anticipo legata a EbM della misura successiva, senza pause visibili a riempire la prima misura. Equivale, per posizionamento e ritmo, a quanto già si ottiene con un accordo implicito al posto di r (Gm EbM(8^)), con la differenza che qui non c'è alcuna sigla all'inizio della misura.

Limitazione attuale. Quando un evento implicito (accordo o r) cade dentro a una tuplet la soppressione visiva non è attiva e il rest torna disegnato. Non si tratta di una scelta semantica: è un vincolo del renderer che potrà essere rimosso in futuro senza modifiche alla sintassi.


4.4 Lista compatta di durate

Quando lo stesso accordo si protrae su più figure ritmiche, invece di ripetere ! per ogni continuazione si può usare una lista di durate separate da virgola dentro le parentesi:

D/Eb(16,8,8,16,16,r16,16,16)

è la forma compatta, equivalente a:

D/Eb(16) !(8) !(8) !(16) !(16) r(16) !(16) !(16)

Regole:

  • ogni segmento ammette valore, valore. (puntato), valore.., valore..., valoret (terzina);
  • un segmento può iniziare con r per inserire una pausa interna (es. r16): l'accordo si interrompe per quella durata e poi riprende con il segmento successivo;
  • il primo segmento non può essere r (la lista deve aprire con l'accordo): D(r16,8) è un errore;
  • *n (moltiplicatore) e ^ (legatura) non sono ammessi all'interno dei segmenti, solo nella forma single-rhythm (valore*n) o sul segmento finale del gruppo (vedi sotto);
  • spazi attorno alle virgole sono tollerati: D(16, 8, 8) è valido.

Legatura ^ su lista compatta. Il ^ finale lega l'ultimo segmento del gruppo all'evento successivo, come una normale legatura di valore sull'ultima nota della misura:

D/Eb(16,8,8,16,16,r16,16,16)^   A
                              ↑
                              ultimo `16` legato ad `A`

Resa visiva. La sigla D/Eb compare una sola volta sopra il pentagramma (ancorata al primo segmento). Sopra al pentagramma viene disegnato il ritmo dell'intero gruppo: la prima figura ha il nome dell'accordo, le successive sono continuazioni mute (nessuna sigla ripetuta), eventuali r interni sono pause visibili.

Round-trip. Salvando e ricaricando, la forma compatta viene preservata: il file .nrk torna identico a quanto scritto.


5. Accordi opzionali

Una parentesi tonda aperta avvia un gruppo di accordi opzionali:

(C Dm G7)

Il gruppo può estendersi su più misure, includendo barline interne:

(FM F#-7 | B7 EM)

Le parentesi tonde sono renderizzate visivamente intorno al gruppo. Gli accordi al suo interno mantengono normale semantica ritmica e di allineamento con le altre righe del datapack.

Un gruppo opzionale può portare un comment-label (§7) attaccato alla parentesi di chiusura, senza whitespace intermedio:

(FM F#-7 | B7 EM)[Bill Evans changes]

6. Polyaccordi (polychord)

Un polyaccordo è un evento accordo costituito da due sigle sovrapposte, lette simultaneamente: una sigla superiore e una sigla inferiore, separate visivamente da una linea orizzontale.

Il polyaccordo è un evento armonico distinto dallo slash chord (§1):

  • slash chord (A/B) → un unico accordo A con basso B
  • polyaccordo ([A|B]) → due accordi indipendenti A e B suonati insieme

6.1 Sintassi

Un polyaccordo è racchiuso fra parentesi quadre, con il carattere | come separatore interno:

[<top>|<bottom>]

Dove:

  • top e bottom sono sigle di accordo valide secondo §2 (root, qualità, estensioni, basso opzionale)
  • le parentesi quadre [ ] sono obbligatorie
  • il separatore | è obbligatorio e compare esattamente una volta
  • non è ammesso whitespace interno

Esempi validi:

[D|EbM]            polyaccordo: D maggiore sopra EbM7
[CM7|F#-7]         polyaccordo con sigle estese
[D/F#|EbM]         top con basso esplicito (slash chord) sopra accordo semplice
[Am|G](8.)         polyaccordo con durata esplicita

Esempi non validi:

[D|EbM|F]          tre livelli non ammessi
[|EbM]             sigla superiore mancante
[D|]               sigla inferiore mancante
[D | EbM]          whitespace interno non ammesso

6.2 Resa visiva

Il polyaccordo viene visualizzato come due sigle impilate verticalmente, separate da una linea orizzontale:

 D
───
EbM

La larghezza orizzontale riservata al polyaccordo è pari alla maggiore fra le due sigle.

6.3 Durata e ritmo

Il polyaccordo è un singolo evento accordale ai fini del ritmo. Tutte le regole di §4 si applicano al polyaccordo come a qualunque altro evento:

  • durata implicita: il polyaccordo conta come un solo evento nella suddivisione della misura
  • durata esplicita: la parentesi tonda segue le parentesi quadre, es. [D|EbM](4)
  • ribattuto (!) e ripetizione (.) operano sull’intero polyaccordo
| [D|EbM] . . [F|G7] |     polyaccordo ripetuto tre volte, poi cambio
| [D|EbM](2) [F|G7](2) |   due polyaccordi, durata esplicita

6.4 Trasposizione

In trasposizione, entrambe le sigle del polyaccordo vengono trasposte indipendentemente secondo le regole del singolo accordo.

6.5 Limiti

  • numero di livelli: esattamente 2 in neumaRk 0.6; estensioni a N livelli sono fuori specifica
  • annidamento: un polyaccordo non può contenere a sua volta un altro polyaccordo
  • gruppo opzionale: un polyaccordo può comparire dentro un gruppo ( … ) di accordi opzionali (§5)

7. Comment-label

Un comment-label è una stringa libera fra parentesi quadre, attaccata in postfix a un evento accordale per annotarlo con testo arbitrario.

7.1 Sintassi

Un comment-label è espresso in due forme container, semanticamente equivalenti, che differiscono solo per la presenza del box grafico:

  • "<testo>" — forma primaria, senza box;
  • [<testo>] — forma variante, con box.

Il testo è una stringa di caratteri stampabili (spazi inclusi) e ammette il markup testuale definito in neumaRk_text_markup.md. Il carattere di chiusura del container (" o ]) non può comparire letteralmente nel testo: usare l'escape \" o \].

Lo stile di default del comment-label è italic, size ridotta, in entrambe le forme. Il box grafico è applicato solo nella variante […].

Tre scope ammessi, distinti per punto di attacco:

  • chord-level — attaccato a un chord event (anche polychord), senza whitespace intermedio:
Eb7alt"tritone"            no box (primaria)
Eb7alt[tritone]            con box (variante)
[A|EbM]"polychord exp."
  • group-level — attaccato alla parentesi di chiusura ) di un gruppo di accordi opzionali (§5):
(FM F#-7 | B7 EM)"Bill Evans changes"
(FM F#-7 | B7 EM)[Bill Evans changes]
  • row-level — come primo token utile della chord-row, preceduto solo dal marker di riga C) / C+. Due forme equivalenti semanticamente:

  • senza barlines — label come unico contenuto della riga (la chord-row non contiene eventi musicali):

    C+ "solos changes"
    C+ [solos changes]
    
  • con barlines — label come primo token dentro le bar della riga, prima di qualunque chord-event:

    C+ | "solos changes" | Cm7 | F7 |
    C+ | [solos changes] | Cm7 | F7 |
    

    Equivale alla forma senza barlines per il segmento di label, e permette di coesistere con eventi successivi della stessa row.

7.2 Disambiguazione

Il delimitatore […] è condiviso con altri costrutti già definiti nella spec. La disambiguazione è posizionale:

Costrutto Forma riconosciuta
Polychord (§6) [<top>\|<bottom>] — contiene \| interno, nessun whitespace
Volta (flow §3.2) attaccato a barline d'inizio misura: \|[1.]
End-decorator (flow §4.3) attaccato a :\| o barline di fine: [xN]:\|, [D.S.]
Comment-label (con box) attaccato a chord / ) di optional group, o primo token della row, nella forma […]

Il parser riconosce il polychord per primo (vincola la forma a | interno), gli altri sono distinti per posizione di attacco.

La forma "…" del comment-label non collide con nessuno di questi costrutti, perché il delimitatore " non è condiviso. La disambiguazione del comment-label "…" resta posizionale (attaccato a chord, ) di gruppo opzionale, o primo token della row).

7.3 Resa visiva

  • chord-level — italic ridotto sopra al chord (sopra l'eventuale notazione ritmica); box grafico solo nella variante […].
  • group-level — italic ridotto sopra al gruppo, allineato a sinistra; box grafico solo nella variante […]. Le parentesi degli optional restano invariate in entrambe le forme.
  • row-level — italic ridotto a inizio riga, allineato col primo evento musicale; box grafico solo nella variante […].

Lo stile di default (italic, size ridotta) è proprietà del costrutto e si applica in entrambe le forme. Il container ("…" vs […]) decide solo la presenza del box (vedi neumaRk_text_markup.md).

7.4 Limiti

  • al massimo un comment-label per evento (errore E126 se duplicato sullo stesso evento), indipendentemente dalla forma container usata ([…] o "…")
  • il label è puramente annotativo: non influisce su pitch, durata, ritmo, flusso musicale né trasposizione
  • ammesso sia su riga base C) sia su righe alternative C+
  • i container […] e "…" sono single-line: il delimitatore di chiusura deve comparire entro fine riga

8. Regole generali di durata

  • in caso di conflitto prevale la sintassi esplicita
  • la normalizzazione non altera la semantica
  • il ritmo implicito è deterministico

Questo documento definisce la semantica armonica e ritmica delle righe di accordi in neumaRk.