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+. 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 sua N) / N2;
  • D) (dinamiche) e L) (lyrics) seguono la sua N) / 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 c eredita a4c5; 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.

8.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.