Vai al contenuto

Seconda voce per rigo

Questo documento definisce la sintassi e la semantica della seconda voce musicale su uno stesso rigo (stave) in neumaRk: marker, posizione strutturale, regole di contesto, resa grafica e diagnostica.

La seconda voce è uno stream musicale indipendente che condivide lo stesso pentagramma della voce principale ma evolve con il proprio ritmo e con il proprio contesto musicale persistente.


1. Definizione

In neumaRk un rigo (stave) può contenere fino a due voci indipendenti:

  • la voce 1 (o voce principale), introdotta dalla riga N) (o N+, vedi neumaRk_datapack.md §4.5);
  • la voce 2 (o voce secondaria), introdotta dalla riga N2, opzionale.

Le due voci:

  • condividono il rigo, la chiave, la tonalità, il metro, le stanghette di misura e la riga degli accordi C);
  • mantengono stream ritmici e melodici indipendenti;
  • hanno contesti musicali persistenti separati (last_pitch, durCtx).

Un rigo può avere al massimo una voce 2. La voce 2 esiste solo se esplicitamente dichiarata: in sua assenza il rigo è monodico.

Stave ≠ voce. Il concetto di rigo (N) / N+) descrive il pentagramma; il concetto di voce (1ª o 2ª) descrive lo stream musicale all'interno di quel pentagramma. Un brano a 4 righi può avere fino a 8 voci totali (4 stave × 2 voci), senza ulteriori limiti aggregati.


2. Sintassi del marker

2.1 Forma

Il marker della voce 2 è la sequenza di due caratteri:

N2

seguita da uno spazio, in analogia a N) e N+. Il token è largo 2 caratteri (la ) non compare), come richiesto per l'allineamento verticale delle stanghette nelle righe del datapack. Scrivere N2) (con la )) è una forma malformata: errore E130.

2.2 Relazione con le regole generali di marcatura

La regola generale (neumaRk_datapack.md §2.1) prevede marcatori formati da una, due o tre lettere maiuscole seguiti da ). I marker N+ e N2 sono varianti morfologiche di N) previste in modo esplicito dalla specifica e non rappresentano un'eccezione arbitraria: la lettera identificativa N resta invariata, e il secondo carattere distingue il ruolo () continuazione, + nuovo rigo, 2 seconda voce).


3. Posizione strutturale e binding

3.1 Gruppo voce

Ogni voce è descritta da un gruppo voce della forma:

[$)] [A)] N) [D)] [L)]      ← gruppo della voce 1
[$)] [A)] N2 [D)] [L)]      ← gruppo della voce 2 (opzionale)

Le righe $), A), D), L) legano per posizione:

  • $) (diteggiatura, neumaRk_fingering.md) e A) (articolazioni) precedono la loro N) / N2, in quest'ordine;
  • D) (dinamiche) e L) (lyrics) seguono la sua N) / N2, in quest'ordine.

Entrambe le voci possono dichiarare le proprie diteggiature, articolazioni, dinamiche e lyrics in modo indipendente.

3.2 Binding al rigo parent

Una riga N2 lega al rigo immediatamente precedente nello stesso datapack, identificato dalla più recente riga N) o N+. L'ordine consigliato fra la N) / N+ parent e la N2 contiene soltanto:

  • le eventuali D) / L) del gruppo voce 1;
  • le eventuali $) / A) del gruppo voce 2.

Altre righe interposte (M), C), F)) non interrompono il binding: la N2 resta la voce 2 del rigo più recente. E123 scatta solo quando nel datapack, prima della N2, non c'è alcuna N) o N+ (§3.4).

3.3 Unicità per rigo

In uno stesso datapack, ciascun rigo può avere al massimo una riga N2. La presenza di più N2 consecutive che leghino allo stesso rigo produce errore E124.

3.4 N2 come prima riga di note

Una N2 non preceduta da una N) o N+ nello stesso datapack non ha un parent valido ed è non valida (E123).


4. Contesto musicale della voce 2

4.1 Stream indipendente

Il contesto musicale persistente definito in neumaRk_specification.md §2.1 è per-stream: ogni coppia (rigo, voce) mantiene il proprio last_pitch, la propria durCtx e lo stato di propagazione degli accidenti di misura.

Gli aggiornamenti di contesto effettuati dagli eventi della voce 1 non modificano il contesto della voce 2, e viceversa.

4.2 Inizializzazione alla prima apparizione

Quando la voce 2 di un rigo compare per la prima volta in un datapack — cioè quando nel datapack precedente lo stesso rigo non conteneva una voce 2 — il suo riferimento iniziale (last_pitch e durCtx) è ereditato dalla voce 1 dello stesso rigo, nello stato all'inizio del datapack corrente.

Equivalentemente: la voce 2 entra come se fosse, in quel preciso istante musicale, una continuazione della voce 1 — e da quell'istante in poi mantiene il proprio stream separato.

// DP1
N) a4

// DP2
N) c           // eredita a4 → c5 (intervallo minimo)
N2 a           // prima apparizione: eredita a4 (voce 1 a inizio DP2)
               // → a4. Da qui voce 2 prosegue con stream proprio.

4.3 Apparizioni successive

Quando la voce 2 era già presente nel datapack precedente, eredita normalmente dal proprio stream:

// DP3
N) c           // eredita da voce 1 di DP2
N2 a           // eredita da voce 2 di DP2

4.4 Voci sospese

Se la voce 2 di un rigo è presente in un datapack, assente nel successivo, e ricompare in un datapack ancora successivo, alla ricomparsa si applica nuovamente la regola §4.2: il contesto della voce 2 è reinizializzato dalla voce 1 dello stesso rigo all'inizio del datapack di ricomparsa.

Il contesto storico della voce 2 anteriore alla sospensione non viene recuperato.

4.5 Voci in stave introdotto con N+

Se la voce 2 compare in un rigo introdotto in quel datapack tramite N+, la voce 1 del rigo è essa stessa "fresh" (riferimento di orientamento basato sulla chiave, vedi neumaRk_notes_and_durations.md §2.2). La voce 2 eredita di conseguenza lo stesso riferimento clef-dipendente all'inizio del proprio stream.


5. Resa grafica

5.1 Direzione dei gambi

La presenza simultanea di voce 1 e voce 2 su uno stesso rigo fissa la direzione dei gambi in modo normativo:

  • voce 1 → gambi sempre in alto;
  • voce 2 → gambi sempre in basso.

Questa regola si applica indipendentemente dall'altezza delle note: con due voci sul rigo, voce 1 ha sempre i gambi in alto e voce 2 sempre in basso. (Su un rigo monodico la direzione dei gambi segue invece le convenzioni automatiche standard.)

L'unica eccezione è l'incrocio di voci (§7): un marker esplicito X commuta l'assegnazione slot→gambo dalla sua colonna in poi. Fuori da una regione di incrocio la regola qui sopra vale invariata.

5.2 Pause

Le pause delle due voci sono indipendenti. Quando la posizione verticale naturale di una pausa entra in collisione con quella dell'altra voce, il renderer applica un offset di chiarezza secondo le convenzioni standard della notazione musicale; questo non altera la semantica.

Resa di riferimento (informativa). La pausa di battuta è per voce: la voce che tace per tutta la misura si disegna con la pausa di semibreve centrata (neumaRk_notes_and_durations.md §3.3.1) anche quando l'altra voce ha note, che restano come sono.


6. Allineamento e validità

6.1 Numero di misure

Se la voce 2 e il rigo parent hanno un numero diverso di misure, il più corto si completa con pause di battuta, senza diagnostici: N2 c d e f | sotto N) c d e f | g a b c | ha una pausa nella seconda misura. È la stessa regola che vale fra righi di un sistema multi-stave (neumaRk_datapack.md §4.3).

6.2 Riga degli accordi

La riga C) è system-wide ed è condivisa da tutte le voci di tutti i righi del datapack. Non esiste una C) per-voce.

6.3 Chiave

La chiave è proprietà del rigo, non della voce. Qualunque direttiva di chiave inline su una riga N2 non è ammessa e produce errore E125, indipendentemente dalla forma: token standalone come primo token (es. N2 (@F) …), a metà misura (N2 c (@F) d …), o decoratore di begin-barline (N2 |(@F) …). La voce 2 eredita la chiave del rigo parent.

6.4 Anacrusi

Il segno di anacrusi > è per-riga e può comparire indipendentemente in N) e in N2.

6.5 Misura ripetuta

Il token % (e varianti %!, %2, %!2, %4, %!4, vedi neumaRk_flow_and_repeats.md §7) si applica per-riga: la sua presenza in N2 ripete la voce 2 della misura sorgente, senza coinvolgere la voce 1. Le copie eventuali di A), D), L) seguono le stesse regole di layer già definite per le righe singole.

6.6 Grace notes

Le grace notes ([ … ], vedi neumaRk_grace_notes.md) sono ammesse all'interno di N2 con le stesse regole della voce 1. Il loro contesto locale di pitch ed accidenti vive nello stream della voce 2.


7. Incrocio di voci (X)

Quando le due voci di un rigo si scambiano di posizione verticale — quella sotto sale sopra l'altra, o viceversa — un marker esplicito X dichiara il punto d'incrocio. Da lì i gambi seguono la posizione e due segmenti obliqui a "X" tracciano ciascuna voce attraverso lo scambio, così l'occhio può seguire ogni voce attraverso l'incrocio.

L'incrocio di voci è editoriale e selettivo: è dichiarato dall'autore con X, mai dedotto da un confronto delle altezze. Due voci che si sfiorano soltanto, o che toccano un unisono di passaggio, spesso non richiedono i segni d'incrocio; il marker lascia la scelta all'autore.

7.1 Il token X

  • X è un token isolato in una riga N) o N2, scritto alla colonna dell'incrocio, fra le note. Appartiene alla stessa classe grammaticale dei token di padding . e |: non è né una nota né un suffisso, e non consuma alcun beat.
  • Può comparire in una qualsiasi delle due voci. Si àncora al confine-nota della voce in cui è scritto, dando un controllo fine sull'istante esatto dell'incrocio anche quando le due voci non sono in omoritmia.
  • Il glifo è la X maiuscola, tenuta distinta dalla testa a croce, che è sempre il suffisso parentesizzato (x) (es. a2(x)).

Una sola X basta a derivare entrambe le oblique: si scrive una volta, nella voce che meglio àncora l'istante. Il pivot dell'altra voce è ricavato dalle note di quest'ultima che scavalcano la stessa colonna.

7.2 Semantica — X è un toggle

X inverte la relazione verticale corrente delle due voci dalla sua colonna in poi, con due effetti:

  1. Flip dello slot-gambo. Le note della voce che era "sopra" passano a gambo-giù, e quelle della voce che era "sotto" a gambo-su, dalla colonna della X fino alla X successiva (o alla fine del passaggio). È uno stato di slot per-colonna guidato dal marker — un'eccezione esplicita e locale alla regola dei gambi fissi di §5.1, non un'euristica basata sull'altezza.
  2. Due segmenti obliqui. Al punto di scambio, per ciascuna voce un segmento unisce la sua nota pivot prima dell'incrocio con la sua nota pivot dopo. I due segmenti si incrociano: è la "X" visibile.

Gli incroci si alternano: una volta che la voce che stava sopra è passata sotto l'altra, la X successiva le riscambia. Il marker non richiede quindi alcun argomento di direzione — è un semplice toggle dello stato corrente.

La riga in cui si scrive X serve a (a) ancorare la colonna (la posizione ritmica) e (b) fissare il pivot di quella voce (le sue due note che la fiancheggiano). Il pivot dell'altra voce è ricavato dalle note di quest'ultima che scavalcano la stessa posizione ritmica. Quando le due voci non sono in omoritmia i due pivot cadono su colonne diverse, così le due oblique prendono pendenze diverse — la caratteristica "X storta".

7.3 Pause ed estremi delle oblique

  • Gli estremi di un'obliqua sono sempre teste di nota reali: una pausa è silenzio e non offre alcuna testa a cui ancorarsi.
  • Quando una voce ha una pausa a ridosso della X, l'obliqua àncora alla nota reale più vicina, saltando le pause. Il flip dello slot-gambo scatta comunque alla colonna della X, sia essa una nota o una pausa.
  • Quando una voce non ha una nota reale su un lato dell'incrocio entro la misura, quell'obliqua è omessa (vedi §7.4).

7.4 Edge case

  • Bordo misura. Se una voce non ha una nota dopo l'incrocio entro la misura, la sua obliqua è omessa. (Prolungarla nella misura seguente è fuori scope.)
  • Primo o ultimo evento del rigo. Trattato come il caso bordo-misura qui sopra: l'obliqua sul lato mancante è omessa.
  • X priva di pivot nella propria riga. Se, anche saltando le pause, la riga che porta la X non ha una nota reale prima o una nota reale dopo entro la misura, non c'è pivot da ancorare e il marker è non valido (errore E132).

7.5 Validazione

Codice Descrizione
E131 Due marker X sulla stessa colonna del rigo (uno per voce, stessa posizione ritmica): un doppio toggle nello stesso istante è ambiguo
E132 X priva di pivot: nessuna nota reale prima o dopo entro la propria riga (anche saltando le pause)

E131 non è una richiesta di sincronizzare le due voci; afferma che non si possono dichiarare due incroci nello stesso istante. Una sola X deriva già entrambe le oblique, quindi una X per voce sulla stessa colonna è ridondante oltre che ambigua.


8. Diagnostica

8.1 Codici di errore

Codice Descrizione
E123 N2 senza un rigo parent (N) o N+) valido nel datapack
E124 Più di una N2 legata allo stesso rigo nel medesimo datapack
E125 Direttiva di chiave inline su una riga N2
E130 Marker voce/rigo malformato N2) / N+) (usa N2 / N+)
E131 Due marker d'incrocio X sulla stessa colonna del rigo (§7.5)
E132 Marker d'incrocio X privo di nota pivot (§7.5)

8.2 Misure non allineate

Un disallineamento del numero di misure fra N2 e il rigo parent ricade sotto le stesse regole di validità del multi-stave (neumaRk_datapack.md §4.3).


9. Esempi

9.1 Voce 2 minimale

C) A7
N) a1
N2 e4 d e2

Rigo unico in chiave di violino. Voce 1: una semibreve a per la misura. Voce 2: due semiminime e una minima.

9.2 Entrambe le voci con A/D/L indipendenti

C) A7
A) .
N) a1
D) f
L) ah
A) ! !
N2 e4 d e2
D) p
L) la la la

La riga A) . lega a N) a1; la riga A) ! ! lega a N2. Dinamiche e lyrics di ciascuna voce sono indipendenti.

9.3 Multi-stave con voce 2 sul rigo superiore

C) G7
N) | <d b>2 <e c>4 |
N2 | g8 a b a g a b a |
N) (@F) | g,4. d'8 e d |

Sistema a due righi. Il rigo superiore (treble) contiene due voci; il rigo inferiore (basso) è monodico.

9.4 Multi-stave con voce 2 sul rigo inferiore

C) G7
N) | <d b>2 <e c>4 |
N+ (@F) | g,4. d'8 e d |
N2 | r4 c8 d e d c b, |

Sistema a due righi introdotto in questo datapack. La N2 lega al rigo introdotto da N+ (basso), che resta quindi a due voci, mentre il rigo superiore (treble) è monodico.

9.5 Voce 2 alla prima apparizione

N) a4

N) c
N2 a

N) c
N2 a
  • DP1: voce 1 termina con a4.
  • DP2: voce 1 c eredita a4 → c5; voce 2 a è alla prima apparizione, eredita a4 da voce 1 all'inizio del datapack → a4.
  • DP3: voce 1 c eredita da voce 1 di DP2 → c5; voce 2 a eredita dal proprio stream (voce 2 di DP2) → a4.

9.6 Voce sospesa e ricomparsa

N) c4
N2 a

N) e

N) c
N2 a
  • DP1: voce 1 c4, voce 2 a4 (prima apparizione, eredita da voce 1 → a4, intervallo minimo).
  • DP2: solo voce 1 → la voce 2 è sospesa.
  • DP3: voce 2 ricompare → la regola §4.2 si applica nuovamente; voce 2 eredita dalla voce 1 di DP3 all'inizio del datapack, non dal proprio stream storico.

9.7 Incrocio di voci

C) Dm7
N)  b4 a  f  e
N2  d4 e  X  g  a

Rigo unico, due voci. La voce 1 scende b–a–f–e; la voce 2 sale d–e–g–a. La X nella voce 2, scritta al confine prima della sua terza nota, commuta la relazione verticale: fino a quella colonna la voce 1 è sopra (gambi in alto) e la voce 2 sotto (gambi in basso); da lì la voce 2 sale sopra la voce 1, così i gambi si invertono e due segmenti obliqui uniscono le note che fiancheggiano l'incrocio in ciascuna voce — voce 1 a→f e voce 2 e→g — disegnando la "X" (§7).