| [ << Modifica delle impostazioni predefinite ] | [Inizio][Contenuti][Indice] | [ Tabelle del manuale della notazione >> ] |
| [ < Uso di alterBroken ] | [ Su : Ritocchi avanzati ] | [ Uso delle funzioni musicali > ] |
5.5.6 Contenitori unpure-pure
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.
| [ << Modifica delle impostazioni predefinite ] | [Inizio][Contenuti][Indice] | [ Tabelle del manuale della notazione >> ] |
| [ < Uso di alterBroken ] | [ Su : Ritocchi avanzati ] | [ Uso delle funzioni musicali > ] |