Play directive¶
Questo documento definisce la sintassi e la semantica della play directive: un meccanismo per cambiare in modo locale lo style e il tempo del brano, agendo a partire da una misura specifica e restando in vigore fino a una nuova direttiva.
La play directive risolve l'esigenza di lead sheet con sezioni a tempo o groove diversi (es. "vamp till cue" rallentando, "double-time" su un solo, cambio da swing a latin a metà brano) senza ricorrere a brani distinti.
1. Definizione¶
Una play directive è un token della riga M) (Markers) che
dichiara, in modo locale, uno o entrambi i seguenti elementi:
- uno style (descrizione testuale del carattere musicale);
- un tempo, espresso come BPM esplicito oppure come metric modulation (relazione metrica fra due figure NRK).
La play directive non è un decoratore di barline: non si attacca al
segno | e non appartiene alla famiglia dei decoratori di misura
([1.] volta, (3/4,Dm) cambio metro/tonalità). È un token autonomo
che convive con i marker testuali nella riga M).
2. Sintassi¶
2.1 Forma generale¶
Due forme alternative:
(=[Style][,Tempo]) con prefisso `=` (Style/BPM/combinato)
(<figura>=<figura>) metric modulation pura (senza prefisso)
Dentro le parentesi tonde:
- Il prefisso
=apre una direttiva con slot Style e/o Tempo (BPM o metric modulation), distinguendola da un cambio metro o tonalità(3/4,Dm). - Una direttiva di sola metric modulation (es.
(4=4.)) si scrive senza prefisso=: la=interna fra due figure NRK è già auto-disambiguante rispetto agli altri token in parentesi.
Quando il prefisso = è presente e Style/Tempo sono entrambi
dichiarati, l'ordine è fisso: Style prima, Tempo dopo, separati
da virgola.
2.2 Slot Style¶
Testo libero che descrive il carattere musicale (es. Rock,
Fast swing, rock ballad, bossa, funk). Valgono le stesse regole
testuali dello slot HS) Style dell'header
(neumaRk_header.md §11.2):
- testo libero multi-parola, spazi interni ammessi;
- virgole interne ammesse (es.
Fast, dirty swing): il parser ricostruisce lo Style usando la regola "parse from end" descritta sotto; - nessun vincolo di capitalization (il rendering preserva la grafia);
- non deve collidere con pattern interpretabili come
Tempo(vedi §2.3 e §3.2).
2.2.1 Disambiguazione Style/Tempo ("parse from end")¶
Quando la direttiva contiene una virgola, il parser cerca l'ultima virgola e prova a interpretare ciò che segue come Tempo (BPM o metric modulation). Se il match riesce → split lì (Style = tutto a sinistra, Tempo = tutto a destra). Se fallisce, il body intero è trattato come un unico slot (Style se l'utente non ha tentato un Tempo, oppure Tempo-only se non ci sono virgole e il body è un Tempo valido).
Conseguenze pratiche:
| Body | Style | Tempo |
|---|---|---|
=Rock,120bpm |
Rock |
120bpm |
=Fast, dirty swing, 180bpm |
Fast, dirty swing |
180bpm |
=swing, 4=4. |
swing |
4=4. |
=foo, bar (no Tempo finale) |
foo, bar |
— |
=120bpm (no virgola, è Tempo) |
— | 120bpm |
2.3 Slot Tempo¶
Due forme alternative, mutuamente esclusive:
2.3.1 BPM esplicito¶
Nbpm
dove N è un intero a 2 o 3 cifre (range 10–999), seguito
immediatamente dal suffisso bpm (case-insensitive: bpm, BPM,
Bpm tutti ammessi). Esempi:
60bpm 120bpm 200bpm 90BPM
Range fuori bounds (5bpm, 1000bpm) produce warning W136.
Decimali (120.5bpm) non sono ammessi (errore di parsing).
2.3.2 Metric modulation¶
<figura-precedente>=<figura-nuova>
dove ciascun lato è una figura NRK (1, 2, 4, 8, 16, 32,
con dotted . e tuplet t ammessi). Convenzione standard (Grove,
Carter): il valore a sinistra è una figura nel tempo precedente,
il valore a destra è una figura nel tempo nuovo; le due figure
hanno la stessa durata fisica. Esempi:
4=2 ♩ = 𝅗𝅥 (la semiminima del tempo precedente vale come minima nuova → double-time)
4=4. ♩ = ♩. (la semiminima precedente vale come semiminima puntata nuova → accelera)
2=4 𝅗𝅥 = ♩ (la minima precedente vale come semiminima nuova → half-time)
4.=4 ♩. = ♩ (la semiminima puntata precedente vale come semiminima nuova → rallenta)
8t=8 ♪₃ = ♪ (la croma di terzina precedente vale come croma nuova → accelera)
La metric modulation è executable: il player ricalcola il BPM
effettivo dalla relazione metrica applicata al currentBPM corrente
(formula in §5.2). Figure non valide (es. 5=4, 4=k) producono
warning W137.
2.4 Esempi sintattici¶
(=Rock,120bpm) style + tempo
(=swing,4=4.) style + metric modulation
(=fast swing) solo style (multi-parola)
(=Fast, dirty swing, 180bpm) style con virgole interne + tempo
(=foo, bar) solo style con virgola (no Tempo finale)
(=120bpm) solo BPM
(8=4) solo metric modulation (NO prefisso `=`)
Forme non valide:
(=) W134 — direttiva vuota
(=120bpm,Rock) W135 — ordine slot invertito
(=5bpm) W136 — BPM fuori range
(4=q) W137 — figura NRK non valida
3. Posizione strutturale¶
3.1 Solo nella riga M)¶
Una play directive può apparire esclusivamente in una riga di
Markers (M), esplicita o dedotta secondo
neumaRk_markers.md §2). La sua presenza in qualunque altra riga
musicale (C), N), A), D), L), F)) produce warning W138.
3.2 Co-locazione con marker testuali¶
Una play directive convive liberamente con marker testuali
([Mark], "freely") nella stessa misura della riga M). La
disambiguazione è per delimitatori:
| Token | Tipo |
|---|---|
[…] / "…" |
marker testuale |
(=…) |
play directive (Style/BPM/combinato) |
(fig=fig) |
play directive (metric modulation pura) |
(…) altro |
decorator di barline (cambio metro/key) — non in M) |
Esempio:
M) | [A] (=Rock,120bpm) |
Misura 1 contiene sia il marker [A] sia la play directive che imposta
Rock 120 BPM dalla stessa misura in poi.
L'ordine fra marker testuali e play directive è libero nella stessa misura: il parser identifica i token per delimitatori.
3.3 Ancoraggio temporale¶
Una play directive si applica a partire dal beat 1 della misura di apparizione, e resta in vigore fino a una nuova play directive (vedi §4).
Non sono ammessi cambiamenti mid-bar: la posizione orizzontale del
token nella riga M) non altera il punto di applicazione, che è
sempre l'inizio della misura.
4. Persistenza e contesto¶
4.1 State machine currentStyle / currentBPM¶
Il contesto musicale persistente del brano (neumaRk_specification.md
§2.1) include due variabili cross-datapack:
currentStyle— inizializzato daHS) Styledell'header;currentBPM— inizializzato daHB) BPMdell'header.
Ogni play directive aggiorna una o entrambe le variabili, a partire dalla misura di apparizione. Le variabili restano poi in vigore fino a una nuova play directive, attraversando i confini fra datapack.
4.2 Direttive a slot singolo¶
Una direttiva che dichiara un solo slot aggiorna solo quella variabile, lasciando l'altra invariata:
M) | (=Rock,120bpm) | | (=fast swing) | (2=4) |
- Misura 1:
currentStyle ← Rock,currentBPM ← 120. - Misura 3:
currentStyle ← fast swing,currentBPMresta 120. - Misura 4:
currentBPM ← currentBPM × (2/4) = 60(metric modulation),currentStyleresta "fast swing".
4.3 Niente reset esplicito¶
Non esiste un token speciale per "tornare ai valori dell'header". Per ripristinare lo style/BPM iniziale si ridichiara esplicitamente:
HS) swing
HB) 140
…
M) | (=Rock,80bpm) | … | (=swing,140bpm) | ← ripristino esplicito
Questa scelta mantiene la spec ortogonale: ogni direttiva è un'azione positiva, non c'è semantica nascosta di "spegnimento".
5. Semantica del player¶
5.1 Executable¶
Le play directive sono istruzioni eseguibili dal player runtime:
- un cambio di
currentBPM(esplicito o via metric modulation) altera immediatamente la velocità di esecuzione; - un cambio di
currentStylesegnala al motore di accompagnamento di cambiare groove (Rock → Bossa → Swing produce pattern diversi di batteria, basso, chitarra di accompagnamento).
L'effettiva mappatura style → groove è responsabilità del player e
non è definita da questa specifica. Style sconosciuti al player sono
trattati come fallback al groove di default, senza errore.
5.2 Metric modulation: calcolo del BPM¶
Convenzione (musicale standard, vedi Grove Music Online ed Elliott
Carter): in una metric modulation S = D il valore a sinistra è
una figura nel tempo precedente, il valore a destra è una
figura nel tempo nuovo. Le due figure hanno la stessa durata
fisica.
Da questa equivalenza si deriva:
dur(S) × (60 / oldBPM) = dur(D) × (60 / newBPM)
⟹ newBPM = oldBPM × dur(D) / dur(S)
dove dur(F) è la durata della figura NRK F in beat unitari
(quarter = 1, whole = 4, half = 2, eighth = 0.5; dotted = 1.5×;
tuplet t = 2/3×).
Esempi (assumendo currentBPM = 120):
| Modulation | newBPM | Effetto musicale |
|---|---|---|
4=2 |
240 | double-time (old ♩ → new 𝅗𝅥) |
4=4. |
180 | accelera (old ♩ → new ♩.) |
8t=8 |
180 | accelera (old ♪₃ → new ♪) |
2=4 |
60 | half-time (old 𝅗𝅥 → new ♩) |
4.=4 |
80 | rallenta (old ♩. → new ♩) |
6. Render¶
6.1 Fascia marker¶
Tutte le play directive sono renderizzate nella stessa fascia dei marker (sopra il rigo), allineate orizzontalmente al beat 1 della misura di apparizione.
6.2 Style¶
Lo style è renderizzato come testo italic, dimensione body. Quando co-localizzato con un marker testuale nella stessa misura, il renderer applica un offset verticale per evitare sovrapposizione, mantenendo entrambi visibili.
6.3 Tempo BPM esplicito¶
Nbpm è renderizzato in notazione tradizionale:
♩ = N
dove la figura della pulsazione è derivata dal denominatore del metro
corrente (4/4 → ♩, 6/8 → ♪., 3/2 → 𝅗𝅥, ecc.). In assenza di un metro
identificabile, default ♩.
6.4 Metric modulation¶
figura₁=figura₂ è renderizzato in notazione tradizionale come:
glyph(figura₁) = glyph(figura₂)
dove glyph(F) è la testa di nota nera/bianca/aperta della figura F,
con dot se dotted, con ³ (o equivalente) se tuplet.
Esempi:
4=4. → ♩ = ♩.
8=4 → ♪ = ♩
8t=8 → ♪³ = ♪
6.5 Style + Tempo combinati¶
Quando una direttiva contiene entrambi gli slot, il render presenta style sopra il tempo in due righe verticali, oppure sulla stessa riga separati da spazio. La scelta è del renderer.
7. Diagnostica¶
7.1 Codici diagnostici¶
| Codice | Descrizione |
|---|---|
| W134 | Direttiva vuota (=): nessuno slot dichiarato |
| W135 | Ordine slot invertito: tempo prima di style |
| W136 | BPM fuori range (atteso intero 10–999) |
| W137 | Figura NRK non valida in metric modulation |
| W138 | Play directive in riga diversa da M) |
7.2 Style sconosciuto¶
Uno style non riconosciuto dal player (es. (=mood music)) non è un
errore: viene rispettato come testo descrittivo e ignorato dal motore
di accompagnamento (fallback al groove di default).
7.3 BPM = 0 o negativo¶
Esclusi dal range; produce W136.
7.4 Direttive ridondanti¶
Una direttiva che riasserisce esattamente i valori correnti (es.
(=Rock,120bpm) quando currentStyle="Rock" e currentBPM=120) è
ammessa, non genera warning. Il player la applica come no-op.
8. Esempi¶
8.1 Cambio tempo a metà brano¶
HS) swing
HB) 140
…
M) | [Solo] | | | (=200bpm) | | | | |
Solo che parte a 140 BPM; dalla misura 4 in poi accelera a 200 BPM.
8.2 Cambio style + tempo combinato¶
M) | [Intro] (=Rock,120bpm) | | | [A] | | (=swing,160bpm) | |
- Misura 1: marker
[Intro]+ setup Rock 120 BPM. - Misura 4: marker
[A](style e tempo invariati). - Misura 6: switch a swing 160 BPM.
8.3 Metric modulation¶
M) | (=swing,120bpm) | | | (2=4) | | | | (4=2) | | |
- Misura 1: swing a 120 BPM.
- Misura 4: half-time (currentBPM = 60).
- Misura 8: double-time rispetto al precedente (currentBPM = 120, torna al valore iniziale).
8.4 Style multi-parola¶
M) | (=Fast swing,200bpm) |
Style "Fast swing" (due parole, spazio interno ammesso), 200 BPM.
8.5 Vamp till cue con cambio style¶
M) | [A] | | | | [? Vamp] (=funk,90bpm) | | | (=swing,140bpm) [B] |
- Misure 1–4: sezione A (style/tempo dall'header).
- Misure 5–7: vamp in funk a 90 BPM (la sezione collassabile
[? Vamp]è definita inneumaRk_markers.md§4). - Misura 8: ritorno a swing 140 BPM, sezione B.
8.6 Solo metric modulation¶
HS) jazz
HB) 120
…
M) | [Theme] | | (4=4.) | | | (4.=4) | |
Tema a 120 BPM; dalla misura 3 accelera a 180 BPM (la semiminima
precedente diventa una semiminima puntata nel nuovo tempo, quindi le
nuove semiminime sono più corte); dalla misura 6 si torna a 120 BPM
(4.=4: la semiminima puntata precedente diventa la nuova semiminima).
9. Riassunto¶
| Concetto | Sintassi | Sezione |
|---|---|---|
| Direttiva Style/BPM | (=[Style][,Tempo]) |
§2.1 |
| Metric modulation pura | (figura=figura) (senza prefisso =) |
§2.1 |
| Style | testo libero multi-parola | §2.2 |
| Tempo BPM | Nbpm (intero 10–999) |
§2.3.1 |
| Metric modulation | figura=figura (NRK valide) |
§2.3.2 |
| Posizione | solo riga M), beat 1 misura |
§3 |
| Persistenza | cross-datapack, fino a nuova direttiva | §4 |
| Semantica | executable (player applica) | §5 |
| Render | notazione tradizionale (♩ = N, ♩ = ♩.) | §6 |
Le play directive estendono le indicazioni globali dell'header (HS),
HB)) con la possibilità di cambi locali durante il brano,
preservando la natura testuale e parsabile del linguaggio.
Questo documento definisce la play directive come meccanismo locale di controllo style e tempo in neumaRk, completando il sistema di indicazioni performative del linguaggio.