Guida alla Notazione di LilyPond: 5.5.6 Contenitori unpure-pure

### 5.5.6 Contenitori unpure-pure

Nota: Sebbene questa sottosezione rifletta lo stato corrente, l’esempio dato è discutibile e non mostra alcun effetto.

I contenitori unpure-pure (impuri-puri) sono utili per sovrascrivere i calcoli di spaziatura dell’asse Y – in particolare `Y-offset` e `Y-extent` – tramite una funzione Scheme invece che con un numero o una coppia di numeri.

Per alcuni grob, il cui `Y-extent` è basato sulla proprietà `stencil`, sovrascrivere tale proprietà renderà necessario un’ulteriore sovrascrittura di `Y-extent` tramite un contenitore unpure-pure. Quando una funzione sovrascrive `Y-offset` e/o `Y-extent`, si presume che ciò innescherà il calcolo delle interruzioni di linea troppo presto durante la compilazione. Dunque la funzione non viene affatto calcolata (e di solito restituirà un valore di ‘`0`’ o ‘`'(0 . 0)`’) e ciò può causare delle collisioni. Una funzione ‘pure’ (pura) non avrà effetto su proprietà, oggetti o “suicidi” dei grob e quindi tutto ciò che è collegato al suo asse Y sarà sempre calcolato correttamente.

Attualmente, ci sono circa trenta funzioni che sono già considerate ‘pure’ e i contenitori unpure-pure sono un modo per impostare le funzioni non ancora presenti in questa lista come ‘pure’. La funzione ‘pure’ viene calcolata prima di qualsiasi interruzione di linea e quindi la spaziatura orizzontale può essere regolata “in tempo”. La funzione ‘unpure’ viene invece calcolata dopo le interruzioni di linea.

Nota: Dato che è difficile sapere sempre quali funzioni si trovano in questa lista, consigliamo a chi crea funzioni ‘pure’ di non usare i grob `Beam` o `VerticalAlignment`.

Un contenitore unpure-pure viene costruito nel modo seguente:

`(ly:make-unpure-pure-container f0 f1)`

dove `f0` è una funzione che prende n argomenti (n >= 1) e il primo argomento deve sempre essere il grob. Questa è la funzione che restituisce il vero risultato. f1 è la funzione etichettata come ‘pure’ che prende n + 2 argomenti. Di nuovo, il primo argomento deve sempre essere il grob, ma il secondo e il terzo sono il punto di partenza, ‘start’, e quello di arrivo, ‘end’.

start e end sono, per tutti gli intenti e scopi, valori fittizi che contano solo per gli estensori, o `Spanners`, (ovvero `Hairpin` o `Beam`), che possono restituire calcoli diversi dell’altezza in base a una colonna di inizio e di fine.

Il resto sono altri argomenti della prima funzione (che potrebbero essere nessuno se n = 1).

I risultati della seconda funzione sono usati come un’approssimazione del valore necessario che viene poi usato dalla prima funzione per ottenere il valore reale, che viene infine usato per la messa a punto, molto più tardi nel corso del processo di spaziatura.

>     #(define (square-line-circle-space grob)
>     (let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch))
>           (notename (ly:pitch-notename pitch)))
>      (if (= 0 (modulo notename 2))
>          (make-circle-stencil 0.5 0.0 #t)
>          (make-filled-box-stencil '(0 . 1.0)
>                                   '(-0.5 . 0.5)))))

>     squareLineCircleSpace = {
>       \override NoteHead.stencil = #square-line-circle-space
>     }

>     smartSquareLineCircleSpace = {
>       \squareLineCircleSpace
>       \override NoteHead.Y-extent =
>        #(ly:make-unpure-pure-container
>           ly:grob::stencil-height
>           (lambda (grob start end) (ly:grob::stencil-height grob)))
>     }

>     \new Voice \with { \remove Stem_engraver }
>     \relative c'' {
>       \squareLineCircleSpace
>       cis4 ces disis d
>       \smartSquareLineCircleSpace
>       cis4 ces disis d
>     }

Nella prima misura, senza il contenitore unpure-pure, il motore della spaziatura non conosce la larghezza della testa di nota e lascia che collida con le alterazioni. Nella seconda misura, che usa i contenitori unpure-pure, il motore della spaziatura conosce la larghezza della testa di nota e evita le collisioni allungando la linea dello spazio necessario.

Di solito per semplici calcoli si possono usare funzioni quasi identiche per entrambe le parti, ‘unpure’ e ‘pure’, cambiando soltanto il numero di argomenti passati e la portata della funzione. Questo caso d’uso è così frequente che `ly:make-unpure-pure-container` costruisce tale seconda funzione automaticamente quando è richiamata con un solo argomento.

Nota: Se una funzione viene etichettata come ‘pure’ ma viene fuori che non lo è, i risultati possono essere imprevedibili.

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