5.5.6 Contenidors unpure-pure

Els contenidors ‘unpure-pure’ (purs i no purs) són útils per a la sobreescriptura dels càlculs de l’espaiat a l’eix Y (concretament Y-offset i Y-extent) amb una funció de l’Scheme en comptes d’un literal, és a dir, un nombre o una parella de nombres.

Per certs objectes gràfics, les dimensions Y-extent estan basades en la propietat stencil, la sobreescriptura de la propietat de segell d’aquests objectes gràfics requereix una sobreescriptura addicional de Y-extent amb un contenidor unpure-pure. Quan una funció sobreescriu una dimensió Y-offset i/o Y-extent se suposa que això dispara els càlculs dels salts de línia prematurament durant la compilació. Així doncs, la funció no s’avalua en absolut (retornant en general un valor de ‘0’ o ‘'(0 . 0)’) cosa que pot ocasionar col·lisions. Una funció ‘pura’ no afecta a les propietats, objectes o suicidis de grobs, i per això els seus valors relacionats amb l’eix Y sempre s’avaluen correctament.

Actualment hi ha unes treinta funcions que ja es consideren ‘puras’ i els contenidors Unpure-pure són una manera d’establir funcions que no estan a la llista com ‘pures’. La funció ‘pura’ s’avalua abans de qualsevol salt de línia i així l’espaiat horitzontal es pot ajustar ‘a temps’. La funció ‘impura’ s’avalua aleshores després del salt de línia.

Nota: Donat que és difícil saber sempre quines funcions estan en aquesta llista, recomanem que qualsevol funció ‘pura’ que estem creant no utilitzeu els grobs Beam o VerticalAlignment.

Un contenidor ‘unpure-pure’ es construeix de la manera següent:

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

on f0 és una funció que agafa n arguments (n >= 1) i el primer argument sempre ha de ser el grob. Aquesta és la funció que dóna el resultat real. f1 és la funció que s’etiqueta com a ‘pura’ que agafa n + 2 arguments. Un altre cop, el primer argument ha de ser sempre el grob però els arguments segon i tercer són arguments d’‘inici’ i de ‘final’.

inici i final són, a tots els efectes, valors muts que sols tenen importància per als objectes d'extensió (o sigui: Hairpin, regulador, o Beam, barra), que poden retornar diferents estimacions d’altura basades en una columna d’inici i una de final.

La resta són els altres arguments per a la primera funció (que pot no ser cap si n = 1).

El resultat de la segona funció s’usa com una aproximació del valor necessari, que s’usa aleshores per la primera funció per obtenir el valor real que s’usa a continuació per a l’ajustament de precisió molt més tardà durant el procés d’espaiat.

#(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]

En el primer compàs, sense el contenidor unpure-pure, el motor d’espaiat no coneix l’amplada del cap de la nota i permet que col·lisioni amb les alteracions accidentals. En el segon compàs, el motor d’espaiat coneix l’amplada dels caps de les notes i evita la col·lisió mitjançant l’allargament de la línia en la mesura adequada.

Normalment, per als càlculs simples es poden usar funcions gairebé idèntiques tant per a les parts ‘no pura’ i ‘pura’, simplement canviant el nombre d’arguments que es passen a, i l’àmbit de la funció. Aquest cas d’utilització és prou suficient com perquè ly:make-unpure-pure-container construeixi aquesta segona funció de forma predeterminada quan es crida amb sols un argument de funció.

Nota: Si una funció està caracteritzada com a ‘pura’ i resulta que no ho és, el resultat pot ser inesperat.


LilyPond — Referència de la notació v2.23.5 (branca de desenvolupament).