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+. La cifra 2 sostituisce
la ), preservando l'invariante di larghezza a 2 caratteri richiesta per
l'allineamento verticale delle stanghette nelle righe del datapack.
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:
A)(articolazioni) precede la suaN)/N2;D)(dinamiche) eL)(lyrics) seguono la suaN)/N2, in quest'ordine.
Entrambe le voci possono dichiarare le proprie 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+. Tra la N) /
N+ parent e la N2 sono ammesse soltanto:
- le eventuali
D)/L)del gruppo voce 1; - l'eventuale
A)del gruppo voce 2.
Qualsiasi altra riga interposta interrompe il binding e rende la N2
non riconosciuta come voce 2 del rigo precedente (errore E123).
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 e sovrascrive ogni euristica di rendering automatico in vigore quando il rigo è monodico.
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.
6. Allineamento e validità¶
6.1 Numero di misure¶
La voce 2 deve contenere lo stesso numero di misure del rigo parent.
È 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. Una direttiva di chiave
inline come primo token di una riga N2 (es. N2 (@F) …) non è ammessa
e produce errore E125.
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. Diagnostica¶
7.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 |
7.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).
8. Esempi¶
8.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.
8.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.
8.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.
8.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.
8.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.
8.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.