Manuale di apprendimento di LilyPond: 4.4.3 Oggetti esterni al rigo

### 4.4.3 Oggetti esterni al rigo

Gli oggetti esterni al rigo sono disposti automaticamente in modo da evitare collisioni. Ci sono vari modi per modificare la disposizione automatica se questa non è ottimale.

#### La proprietà `outside-staff-priority`

Gli oggetti dai valori più bassi per la proprietà `outside-staff-priority` vengono posizionati più vicino al rigo, mentre gli altri oggetti esterni al rigo vengono distanziati quanto basta per evitare collisioni. La proprietà `outside-staff-priority` è definita nell’interfaccia `grob-interface` ed è quindi una proprietà di tutti gli oggetti di formattazione. Il valore predefinito è `#f` per tutti gli oggetti interni al rigo e un valore numerico appropriato, determinato al momento della creazione dell’oggetto, per ogni oggetto esterno al rigo. La seguente tabella mostra i valori numerici predefiniti di alcuni dei più comuni oggetti esterni al rigo.

Si notino i nomi insoliti di alcuni oggetti: gli oggetti estensori (spanner) sono creati automaticamente per controllare la disposizione verticale dei grob che (potrebbero) iniziare e finire in diversi momenti musicali, quindi la modifica della proprietà `outside-staff-priority` del grob sottostante non produrrebbe alcun effetto. Ad esempio, la modifica di `outside-staff-priority` dell’oggetto `Hairpin` non avrà alcun effetto sulla disposizione verticale delle forcelle. Occorre invece modificare la proprietà `outside-staff-priority` dell’oggetto associato `DynamicLineSpanner`. Questa sovrascrittura deve essere posta all’inizio dell’estensore, che potrebbe includere più forcelle e indicazioni dinamiche tra loro collegate.

Oggetto di formattazione | Priorità | Controlla la posizione di:
--- | --- | ---
`RehearsalMark` | `1500` | Numeri di chiamata (e oggetti di testo analoghi)
`MetronomeMark` | `1000` | Indicazioni metronomiche
`SostenutoPedalLineSpanner` | `1000` | Indicazione del pedale
`SustainPedalLineSpanner` | `1000` |
`UnaCordaPedalLineSpanner` | `1000` |
`MeasureCounter` | `750` | Numero della misura
`VoltaBracketSpanner` | `600` | Delimitatori dei finali alternativi delle ripetizioni
`InstrumentSwitch` | `500` | Testo per il cambio di strumento
`TextScript` | `450` | Oggetti di testo
`MultiMeasureRestText` | `450` | Testi sopra pause multiple
`CombineTextScript` | `450` | Testo per il combinatore delle parti
`OttavaBracket` | `400` | Estensioni del segno d’ottava
`TextSpanner` | `350` | Estensori del testo
`DynamicLineSpanner` | `250` | Tutte le indicazioni dinamiche
`BarNumber` | `100` | Numeri di battuta
`TrillSpanner` | `50` | Linee ondulate del trillo
`AccidentalSuggestion` | `0` | Alterazioni con nota

Ecco un esempio che mostra il posizionamento predefinito di alcuni di questi oggetti.

>     % Imposta i dettagli per l'estensore del testo seguente
>     \override TextSpanner.bound-details.left.text
>         = \markup { \small \bold Slower }
>     % Posiziona le dinamiche sopra il rigo
>     \dynamicUp
>     % Inizia la parentesi dell'ottava
>     \ottava #1
>     c''4 \startTextSpan
>     % Aggiunge il testo della dinamica e la forcella
>     c''4\pp\<
>     c''4
>     % Aggiunge la scritta testuale
>     c''4^Text |
>     c''4 c''
>     % Aggiunge il testo della dinamica e termina la forcella
>     c''4\ff c'' \stopTextSpan |
>     % Chiude la parentesi dell'ottava
>     \ottava #0
>     c'4 c' c' c' |

Questo esempio mostra anche come creare gli estensori (spanner) del testo, ovvero testo con delle linee che si estendono sopra una sezione musicale. L’estensore si allunga dal comando `\startTextSpan` fino al comando `\stopTextSpan` e il formato del testo è definito dal comando `\override TextSpanner`. Per maggiori dettagli si veda Estensori del testo.

Mostra anche come si creano le estensioni del segno d’ottava.

Se i valori predefiniti di `outside-staff-priority` non producono il posizionamento desiderato, è possibile sovrascrivere la priorità di qualsiasi oggetto. Immaginiamo di voler posizionare l’estensione del segno d’ottava sotto l’estensore del testo nell’esempio precedente. Basta controllare la priorità dell’oggetto `OttavaBracket` nella guida al Funzionamento interno o nella tabella precedente e ridurla a un valore inferiore di quello di un oggetto `TextSpanner`, ricordando che `OttavaBracket` è creato nel contesto `Staff`:

>     % Imposta i dettagli per l'estensore del testo seguente
>     \override TextSpanner.bound-details.left.text
>         = \markup { \small \bold Slower }
>     % Posiziona le dinamiche sopra il rigo
>     \dynamicUp
>     % Inizia la parentesi dell'ottava
>     \ottava #1
>     c''4 \startTextSpan
>     % Aggiunge il testo della dinamica e la forcella
>     c''4\pp\<
>     c''4
>     % Aggiunge la scritta testuale
>     c''4^Text |
>     c''4 c''
>     % Aggiunge il testo della dinamica e termina la forcella
>     c''4\ff c'' \stopTextSpan |
>     % Chiude la parentesi dell'ottava
>     \ottava #0
>     c'4 c' c' c' |

Si noti che alcuni di questi oggetti, in particolare i numeri di battuta, i segni di metronomo e i numeri di chiamata, si trovano nel contesto `Score`; dunque, assicurati di richiamare il contesto giusto per sovrascriverli.

Le legature di portamento sono classificate come oggetti interni al rigo, anche se spesso sono poste sopra il rigo, se le note alle quali sono collegate si trovano nella parte superiore del pentagramma. Questo può far sì che gli oggetti esterni al rigo, come le articolazioni, siano spinti troppo in alto, dato che la legatura viene posizionata prima. La proprietà `avoid-slur` dell’articolazione può essere impostata su `'inside` per portare l’articolazione dentro la legatura, ma la proprietà `avoid-slur` funziona solo se anche `outside-staff-priority` è impostata su `#f`. Altrimenti, si può impostare la proprietà `outside-staff-priority` della legatura di portamento su un valore numerico, in modo che sia posizionata insieme ad altri oggetti esterni al rigo in base a quel valore. Ecco un esempio che mostra l’effetto dei due metodi:

>     \relative c'' {
>       c4( c^\markup { \tiny \sharp } d4.) c8 |
>       c4(
>         \once \override TextScript.avoid-slur = #'inside
>         \once \override TextScript.outside-staff-priority = ##f
>         c4^\markup { \tiny \sharp } d4.) c8 |
>       \once \override Slur.outside-staff-priority = #500
>         c4( c^\markup { \tiny \sharp } d4.) c8 |
>     }

Attraverso la proprietà `outside-staff-priority` si può regolare anche la disposizone verticale di singoli oggetti; i risultati potrebbero tuttavia risultare non sempre ottimali. Supponiamo di voler posizionare “Testo3” sopra “Testo4” nell’esempio precedente (si veda Comportamento automatico). Basta andare a cercare la priorità di `TextScript` nella guida al Funzionamento interno o nelle tabelle precedenti e aumentare la priorità di “Testo3” assegnando un valore più alto:

>     c''2^"Testo1"
>     c''2^"Testo2" |
>     \once \override TextScript.outside-staff-priority = #500
>     c''2^"Testo3"
>     c''2^"Testo4" |

Questo ovviamente pone “Testo3” sopra “Testo4”, ma anche sopra “Testo2”, mentre “Testo4” si sposta più in basso. Forse questo risultato non ci soddisfa: vorremmo piuttosto collocare tutti i testi alla stessa distanza dal rigo. Per riuscirci, naturalmente, dobbiamo creare più spazio orizzontale tra le note per far posto al testo. Lo si può ottenere con il comando `textLengthOn`.

#### Il comando `\textLengthOn`

Per impostazione predefinita, finché si tratta di formattare la musica il testo prodotto dal comando `\markup` non occupa uno spazio orizzontale. Il comando `\textLengthOn` inverte questo comportamento e fa sì che le note si distanzino quanto basti per introdurre il testo:

>     % Fa sì che le note si distanzino per introdurre il testo
>     \textLengthOn
>     c''2^"Text1"
>     c''2^"Text2" |
>     c''2^"Text3"
>     c''2^"Text4" |

Il comando che ripristina il comportamento predefinito è `\textLengthOff`. Altrimenti si può usare `\once` con `\textLengthOn` se l’effetto deve essere limitato a un singolo momento musicale. Analogalmente, la spaziatura per i segni di chiamata e le indicazioni di tempo è regolata in modo indipendente con i comandi `\markLengthOn` e `\markLengthOff`.

Per parte sua, anche il testo a margine eviterà le note che si estendono sopra il rigo. Se lo si vuole evitare, la disposizione automatica in alto può essere disattivata impostando la priorità su `#f`. Ecco un esempio che mostra come il testo a margine interagisce con tali note.

>     \relative {
>       % Questo testo è abbastanza corto per starci senza creare collisioni
>       c2^"Tes" c'' |
>       R1 |

>       % Questo è troppo lungo per starci, quindi è spostato più in alto
>       c,,2^"Testo" c'' |
>       R1 |

>       % Disattiva l'elusione delle collisioni
>       \once \override TextScript.outside-staff-priority = ##f
>       c,,2^"Testo Lungo   " c'' |
>       R1 |

>       % Disattiva l'elusione delle collisioni
>       \once \override TextScript.outside-staff-priority = ##f
>       \textLengthOn          % e attiva textLengthOn
>       c,,2^"Testo Lungo   "  % Gli spazi finali vengono rispettati
>       c''2 |
>     }

#### Posizionamento delle dinamiche

Le indicazioni dinamiche sono di norma poste sotto il rigo, ma possono essere collocati al di sopra del pentagramma col comando `\dynamicUp`. Vengono posizionati verticalmente rispetto alla figura cui si riferiscono e fluttuano sopra (o sotto) tutti gli oggetti interni al rigo come le legature di fraseggio e i numeri di battuta. Si ottengono risultati abbastanza accettabili, come dimostra questo esempio:

>     \relative {
>       \clef "bass"
>       \key aes \major
>       \time 9/8
>       \dynamicUp
>       bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! |
>       ees,2.~\)\mf ees4 r8 |
>     }

Tuttavia, se le note e le loro dinamiche sono molto vicine, la disposizione automatica eviterà le collisioni spostando più all’esterno i segni di dinamica successivi. Questo potrebbe non essere però il posizionamento migliore, come mostra questo esempio piuttosto improbabile:

>     \dynamicUp
>     \relative { a'4\f b\mf a\mp b\p }

Se si dovesse presentare una situazione simile in un ‘vero’ brano musicale, converrebbe distanziare un po’ di più le note, in modo che i segni di dinamica possano essere tutti collocati alla stessa distanza verticale dal rigo. Abbiamo potuto farlo per il testo a margine usando il comando `\textLengthOn`, ma non esiste un comando equivalente per i segni di dinamica. Dunque dovremo scoprire come farlo usando i comandi `\override`.

#### Dimensione dei grob

### Estensione dei grob

Dobbiamo innanzitutto sapere come i grob occupano lo spazio. Tutti i grob hanno al loro interno un punto di riferimento che viene usato per posizionarli in modo relativo all’oggetto genitore da cui derivano. Questo punto nel grob viene poi disposto a una distanza orizzontale, `X-offset`, e a una distanza verticale, `Y-offset`, dall’oggetto genitore. L’estensione (extent) orizzontale dell’oggetto è data da una coppia di numeri, `X-extent`, che indica dove si trovano i margini sinistro e destro rispetto al punto di riferimento. L’ampiezza verticale è ugualmente definita da una coppia di numeri, `Y-extent`. Queste proprietà appartengono a tutti i grob che supportano l’interfaccia `grob-interface`.

Per impostazione predefinita, gli oggetti esterni al rigo presentano estensione pari a zero, in modo da potersi sovrapporre nella direzione orizzontale. Ciò si ottiene con un trucco, ovvero dando un valore infinito all’estensione sinistra e infinito negativo a quella destra, impostando la proprietà `extra-spacing-width` su `'(+inf.0 . -inf.0)`. Per assicurarci che non si sovrappongano nella direzione orizzontale, dobbiamo sovrascrivere il valore di `extra-spacing-width` per dar loro un po’ più di spazio. Le unità sono lo spazio tra due linee del rigo, dunque spostare il margine sinistro di mezza unità a sinistra e quello destro di mezza unità a destra dovrebbe dare il risultato desiderato:

>     \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5)

Vediamo se funziona nell’esempio precedente:

>     \dynamicUp
>     % Aumenta la larghezza di 1 spazio rigo
>     \override DynamicText.extra-spacing-width = #'(-0.5 . 0.5)
>     \relative { a'4\f b\mf a\mp b\p }

L’aspetto è migliore, ma sarebbe preferibile avere i segni di dinamica allineati alla stessa linea di base invece di spostarsi su e giù seguendo la posizione delle note. La proprietà che permette di ottenere tale risultato è `staff-padding` ed è trattata nella sezione relativa alle collisioni (vedi Collisioni tra oggetti).

#### LilyPond — Manuale di apprendimento v2.22.2 (ramo stabile).