Guida alla Notazione di LilyPond: 5.3.6 Il comando \offset

### 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 di `number`, `number-pair` e `number-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 oggetto `Arpeggio`.

- 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 valore `booleano`. 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')
>     }

#### LilyPond — Guida alla Notazione v2.24.4 (ramo stabile).