[ << Modifica delle impostazioni predefinite ] | [Top][Contents][Index] | [ Tabelle del manuale della notazione >> ] |
[ < Uso di \alterBroken ] | [ Up : Ritocchi avanzati ] | [ Uso delle funzioni musicali > ] |
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.
[ << Modifica delle impostazioni predefinite ] | [Top][Contents][Index] | [ Tabelle del manuale della notazione >> ] |
[ < Uso di \alterBroken ] | [ Up : Ritocchi avanzati ] | [ Uso delle funzioni musicali > ] |