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 §10.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 |
=Swing, 92,5bpm (BPM non intero) |
Swing, 92,5bpm |
— (W136) |
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.
Un BPM non intero, col punto o con la virgola decimale (120.5bpm,
120,5bpm), produce W136 (W136.bpm_not_integer): la direttiva non imposta
il tempo, che resta quello in vigore, e il testo resta Style. Vale anche dopo uno
Style: in (=Swing, 92,5bpm) la virgola decimale non separa gli slot, il
diagnostico è lo stesso e l'intero corpo resta Style.
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 BPM effettivo si ricalcola
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
(=120.5bpm) W136 — BPM non intero (W136.bpm_not_integer)
(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)) produce warning W138. Nella
riga F) il contenuto a lato è prosa descrittiva (neumaRk_datapack.md §9.1):
lì (=Swing,120) è testo, non una direttiva.
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 Ripristino dei valori¶
Per riportare style e/o BPM ai valori iniziali si ridichiara
esplicitamente il valore desiderato con una nuova direttiva
(es. (=swing,140bpm)):
HS) swing
HB) 140
// …
M) | (=Rock,80bpm) | | (=swing,140bpm) | // ripristino esplicito
Ogni direttiva è un'azione positiva che imposta uno stato.
5. Semantica di esecuzione¶
5.1 Executable¶
Le play directive sono istruzioni eseguibili:
- un cambio di
currentBPM(esplicito o via metric modulation) altera immediatamente la velocità di esecuzione; - un cambio di
currentStylecambia il carattere dell'accompagnamento (Rock → Bossa → Swing sono groove diversi).
L'effettiva mappatura style → groove è responsabilità
dell'implementazione e non è definita da questa specifica. Uno style
che l'implementazione non conosce ricade sul 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.
Resa di riferimento (informativa). Ogni play directive è racchiusa in una cornice aperta in basso: due archi a forma di parentesi tonda ai lati, uniti in alto da una linea. La cornice appartiene alla direttiva e non è la cornice tonda
("…")del markup (neumaRk_text_markup.md§2.1).
6.2 Style¶
Lo style è renderizzato come testo normale (tondo), dimensione
body. Il contenuto è soggetto al markup unificato di
neumaRk_text_markup.md: corsivo/grassetto/sottolineato/size si
ottengono solo tramite i marcatori (*…*, **…**, __…__, #), ad
es. (=*Ballad*). 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) o non intero, col punto o con la virgola decimale (W136.bpm_not_integer) |
| W137 | Figura NRK non valida in metric modulation |
| W138 | Play directive in riga diversa da M) |
7.2 Style sconosciuto¶
Uno style non riconosciuto dall'implementazione (es. (=mood music)) non
è un errore: resta testo descrittivo e non seleziona alcun groove
(fallback al 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. Si 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] | | | |
M) [? Vamp] (=funk,90bpm) | | |
M) (=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; apre una riga, §4.7). - 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 (applicata in esecuzione) | §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.