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
}

[image of music]

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.


Guida alla Notazione di LilyPond v2.25.21 (ramo di sviluppo).