5.3.6 Il comando \offset
Sebbene sia possibile impostare le proprietà dei grob su nuovi valori coi
comandi \override
, \tweak
e \overrideProperty
, è spesso
più opportuno modificare tali proprietà in modo relativo a un valore
predefinito. A questo fine è stato creato il comando \offset
.
La sintassi di \offset
è
[-]\offset proprietà offset elemento
Il comando funziona aggiungendo i contenuti di offset all’impostazione predefinita della proprietà proprietà del grob indicato da elemento.
A seconda di come è formulato il comando, \offset
può comportarsi
come un \tweak
o come un \override
. Le variazioni d’uso
sono trattate dopo aver considerato le proprietà del grob che possono
essere usate con \offset
.
Proprietà che possono essere spostate con offset
Molte, ma non tutte, le proprietà dei grob possono essere spostate con
offset. Se la proprietà non può essere spostata con offset, l’oggetto
resterà invariato e apparirà un avviso. In questi casi bisogna usare
\override
o \tweak
per modificare l’oggetto.
Si potrebbe procedere per prova e errore e basarsi sugli avvisi per capire cosa può essere spostato con offset e cosa no. Tuttavia si può usare un approccio più sistematico.
I seguenti criteri determinano se una proprietà possa essere modificata con
\offset
:
- La proprietà ha un’‘impostazione predefinita’ nella descrizione del grob. Queste proprietà sono elencate, per ogni grob, in All layout objects (si trovano anche in scm/define-grobs.scm).
- La proprietà accetta un valore numerico. I valori numerici comprendono
number
, una lista dinumber
,number-pair
enumber-pair-list
. Le pagine in All layout objects elencano il tipo di dati tipici di ciascuna proprietà. È irrilevante che l’impostazione predefinita sia una funzione. - La proprietà non può essere una ‘sottoproprietà’, ovvero una proprietà che risiede all’interno di un’altra proprietà.
- Le proprietà impostate su valori infiniti non possono essere spostate con offset, perché non esiste un modo sensato per spostare un infinito positivo o negativo.
Gli esempi seguenti prendono in considerazione varie proprietà grob in relazione ai criteri appena delineati.
- Proprietà che possono essere spostate con offset
Hairpin.height
-
Questa proprietà non è una sottoproprietà e è elencata in Hairpin. Come valore prende ‘dimensione, in spazi rigo’ impostata su
0.6666
, ovviamente non un numero infinito. Arpeggio.positions
-
La pagina Arpeggio elenca una proprietà
positions
che accetta una ‘coppia di numeri’. Il suo valore predefinito èly:arpeggio::positions
, una funzione di callback che verrà elaborata durante la fase di formattazione tipografica per emettere una coppia di numeri per ogni oggettoArpeggio
.
- Proprietà che non possono essere spostate con offset
Hairpin.color
-
color
non è presente in Hairpin. Hairpin.circled-tip
-
L’elenco per
Hairpin.circled-tip
in Hairpin mostra che prende un valorebooleano
. I booleani sono non numerici. Stem.details.lengths
-
Benché sia elencato in Stem e il suo valore predefinito sia un elenco di
number
, si tratta di una ‘sottoproprietà’. Attualmente non sono supportate le ‘proprietà annidate’.
\offset come override
Se elemento è un nome di grob come Arpeggio
o
Staff.OttavaBracket
, il risultato è un \override
del tipo
di grob specificato.
\offset proprietà offset [contesto.]NomeGrob
Notare che il trattino iniziale non è mai usato nella forma ‘override’,
proprio come non è mai usato col comando \override
stesso.
L’esempio seguente usa la forma ‘override’ per allungare gli arpeggi
predefiniti mostrati nella prima misura in modo che coprano del tutto
l’esensione degli accordi. Gli arpeggi sono allungati di mezzo spazio
rigo verso l’alto e verso il basso. Viene mostrata anche la stessa
operazione fatta sul primo accordo con un normale override della proprietà
positions
. Questo metodo non rispecchia affatto il compito di
‘allungare di mezzo spazio rigo’, perché le estremità devono essere
specificate con coordinate assolute invece che relative. Inoltre, sarebbero
necessari override individuali per ciascuno degli altri accordi, dato che
variano in dimensione e posizione.
arpeggioMusic = { <c' e' g'>\arpeggio <a' c'' e''>\arpeggio <d' f' a' c''>\arpeggio <c' e' g' b' d'' f'' a''>\arpeggio } { \arpeggioMusic \bar "||" \offset positions #'(-0.5 . 0.5) Arpeggio \arpeggioMusic \bar "||" \once \override Arpeggio.positions = #'(-3.5 . -0.5) <c' e' g'>1\arpeggio \bar "||" }
Nel suo uso come ‘override’, \offset
può essere preceduto da
\once
o \temporary
e annullato con \revert
e la
proprietà (vedi Intermediate substitution functions).
Ciò deriva dal fatto che \offset
in realtà crea un
\override
della proprietà.
music = { c'8\< d' e' f'\! } { \music \offset height 1 Hairpin \music \music \revert Hairpin.height \music \bar "||" \once \offset height 1 Hairpin \music \music \bar "||" \override Hairpin.height = 0.2 \music \temporary \offset height 2 Hairpin \music \music \revert Hairpin.height \music \bar "||" }
Proprio come \override
, la forma ‘override’ di \offset
può
essere usata con \undo
e \single
.
longStem = \offset length 6 Stem { \longStem c'4 c''' c' c'' \bar "||" \undo \longStem c'4 c''' c' c'' \bar "||" \single \longStem c'4 c''' c' c'' \bar "||" }
\offset come tweak
Se elemento è un’espressione musicale come (
o
\arpeggio
, il risultato è la stessa espressione musicale
con una modifica di tipo tweak applicata.
[-]\offset [NomeGrob.]proprietà offset espressione-musicale
La sintassi di \offset
nella sua forma ‘tweak’ è analoga a quella
dello stesso comando \tweak
, sia nell’ordine sia in presenza o assenza
del trattino iniziale.
L’esempio seguente usa la forma ‘tweak’ per regolare la posizione verticale
dell’oggetto BreathingSign
. Si confronti questo col normale comando
\tweak
che lo segue. La sintassi è equivalente, ma l’output di
\tweak
è meno intuitivo, perché BreathingSign.Y-offset
è
calcolato dalla linea centrale del pentagramma. Al contratio, non è necessatio
conoscere come è calcolato Y-offset
quando si usa \offset
.
{ c''4 \breathe c''4 \offset Y-offset 2 \breathe c''2 \tweak Y-offset 3 \breathe }
Nell’esempio precedente, gli oggetti modificati sono stati creati direttamente
dall’input dell’utente: il comando \breathe
è un’istruzione esplicita
che restituisce un oggetto BreathingSign
. Dato che l’ambito del comando
era non ambiguo, non è stato necessario specificare il nome dell’oggetto.
Ma quando un oggetto viene creato indirettamente, bisogna includere il
nome del grob. Ciò è valido anche per il comando \tweak
.
Nell’esempio seguente, l’oggetto Beam
viene abbassato di due spazi
rigo applicando \offset
alla proprietà positions
.
Il primo impiego di \offset
richiede la presenza del nome del grob,
perché nessun elemento dell’input crea esplicitamente la travatura. Nel
secondo impiego la travatura viene creata manualmente con l’espressione
musicale [
; dunque il nome del grob non è necessario. L’esempio
mostra anche una scorciatoia: un singolo numero
viene applicato
a entrambi i membri di una coppia di numeri.)
{ c''8 g'' e'' d'' \offset Beam.positions #'(-2 . -2) c''8 g'' e'' d'' c''8 g'' e'' d'' c''8-\offset positions #-2 [ g'' e'' d''] }
\offset con estensori spezzati
È anche possibile modificare in modo indipendente i segmenti di un estensore che va oltre una o più interruzioni di linea. In questo caso, offset prende una lista di valori del tipo di dati richiesto dalla proprietà.
Il comando \offset
usato in questo modo è simile al comando
\alterBroken
, vedi Modifica degli estensori spezzati.
Tuttavia, diversamente da \alterBroken
, i valori assegnati a
\offset
non sono assoluti, ma relativi.
L’esempio seguente sposta l’oggetto ‘spezzato’ OttavaBracket
attraverso la sua proprietà staff-padding
. Dato che la proprietà
prende un numero
, a offset viene fornita una lista di
numeri
per rendere conto dei due segmenti creati dall’interruzione
di linea.
Il pezzo di parentesi dell’ottava sulla prima linea non viene modificato
perché viene aggiunto 0
al suo valore predefinito di staff-padding
.
Il segmento sulla seconda linea viene alzato di tre spazi rigo dalla sua
altezza predefinita. L’altezza predefinita è 2
, anche se non è
necessario saperlo per ottenere la posizione desiderata.
{ \offset staff-padding #'(0 3) Staff.OttavaBracket \ottava #1 c'''2 c''' \break c'''2 c''' }
L’esempio seguente imita l’effetto del comando \shape
spostando la
proprietà control-points
dell’oggetto Slur
.
Qui offset è una lista di number-pair-list
, una per ciascun
segmento della legatura di portamento. Questo esempio realizza un risultato
identico a quello corrispondente in Modifica delle forme.
{ c'4-\offset control-points #'( ((0 . 0) (0 . 0) (0 . 0) (0 . 1)) ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5)) ) ( f'4 g' c'' \break d'4 c'' f' c') }