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)(oN+, vedineumaRk_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) eA)(articolazioni) precedono la loroN)/N2, in quest'ordine;D)(dinamiche) eL)(lyrics) seguono la suaN)/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
Xcommuta 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 rigaN)oN2, 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
Xmaiuscola, 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:
- 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
Xfino allaXsuccessiva (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. - 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 dellaX, 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.
Xpriva di pivot nella propria riga. Se, anche saltando le pause, la riga che porta laXnon 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
cereditaa4→c5; voce 2aè alla prima apparizione, ereditaa4da voce 1 all'inizio del datapack →a4. - DP3: voce 1
ceredita da voce 1 di DP2 →c5; voce 2aeredita 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 2a4(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).