Manual d'aprenentatge del GNU LilyPond: 5.3.1 Visibilitat i color dels objectes

### 5.3.1 Visibilitat i color dels objectes

Dins d’una ús educatiu de la música, podríem desitjar imprimir una partitura amb certs elements omesos com a exercici per a l’alumne, a qui es demana que els completi. Com a exemple senzill, suposem que l’exercici és escriure les línies divisòries que falten en un fragment musical. Però les línies divisòries que normalment s’insereixen automàticament, com fem perquè no s’imprimeixin?

Abans d’embolicar-nos amb això, recordem que les propietats dels objectes s’agrupen en el que hem anomenat interfaces (vegeu Propietats de les interfícies). Això implica simplement agrupar les propietats que es poden usar juntes per ajustar un objecte gràfic: si una d’elles es necessita per a un objecte, també les altres. Així, certs objectes usen les propietats d’alguns interfícies, altres usen les d’altres interfícies. Les interfícies que contenen les propietats que un determinat grob necessita es troben relacionades al manual RFI al final de la pàgina que descriu aquest grob, i aquestes propietats es poden veure mirant aquestes interfícies.

Hem explicat com trobar informació sobre els grobs a Propietats dels objectes de presentació. Usant el mateix enfocament, anem al RFI per buscar l’objecte de presentació que imprimeix les línies divisòries. Mitjançant l’enllaç Backend i All layout objects trobem que hi ha un objecte de presentació anomenat `Barline`. Entre les seves propietats es troben dues que controlen la visibilitat: `break-visibility` i `stencil`. Les línies divisòries també contemplen una sèrie d’interfícies, entre ells el `grob-interface`, on podem trobar les propietats `transparent` i `color`. Totes poden afectar la visibilitat de les barres de compàs (i, per suposat, per extensió, també la de molts altres objectes de presentació). Considerarem cada un d’ells per ordre.

#### La propietat `stencil` (segell)

Aquesta propietat controla l’aparença de les barres de compàs mitjançant l’especificació del símbol (o «glif») que s’ha d’imprimir. Igual que com altres moltes propietats, es pot establir de forma que no imprimeixi res ajustant el seu valor a `#f`. El provarem, com abans, ometent el Context implícit, p`Voice`:

>     \relative {
>       \time 12/16
>       \override BarLine.stencil = ##f
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Les barres de compàs encara s’imprimeixen. Què és el que està malament? Torneu al RFI i mireu un altre cop la pàgina que ofereix les propietats de l’objecte Barline. Al principi de la pàgina diu “Barline objects are created by: Bar_engraver” (els objectes Barline es creen pel gravador Bar_engraver). Aneu a la pàgina del gravador `Bar_engraver` seguint l’enllaç. Al final dóna una llista de contextos en els quals el gravador de línies divisòries opera. Tots ells són del tipus `Staff`, i així la raó que l’ordre `\override` no funcionés com esperàvem, és perquè `Barline` no es troba en el context predeterminat `Voice`. Si el context no s’especifica correctament, l’ordre simplement no funciona. No es produeix cap missatge d’error, i no es registra res al fitxer log de registre. Intentarem corregir-lo escrivint el context correcte:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.stencil = ##f
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Ara les barres de compàs han desaparegut. L’operació d’establir la propietat `stencil` al valor `#f` és tan freqüent que hi ha una abreviatura per a ella, anomenada `\omit` (ometre):

>     \relative {
>       \time 12/16
>       \omit Staff.BarLine
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Malgrat això, observeu que l’establiment de la propietat `stencil` al valor `#f` produeix error quan es requereixen les dimensions de l’objecte per un processament correcte. Per exemple, es generen errors si la propietat `stencil` de l’objecte `NoteHead` s’estableix al valor `#f`. Si és el cas, podem en comptes d’això utilitzar la funció `point-stencil`, que estableix el segell a un objecte amb mida nul·la:

>     \relative {
>       c''4 c
>       \once \override NoteHead.stencil = #point-stencil
>       c4 c
>     }

#### La propietat `break-visibility` (visibilitat del salt)

Veiem a les propietats de `BarLine` que apareixen al RFI que la propietat `break-visibility` requereix un vector de tres valors booleans. Controlen respectivament si les barres de compàs s’imprimeixen al final d’una línia, a meitat d’una línia, i al principi de les línies. Per al nostre exemple, volem que totes les barres de compàs es suprimeixin, per la qual cosa el valor que ens cal és `#(#f #f #f)` (disponible també sota el nom `all-invisible`, totes invisibles). Anem a provar-lo, recordant incloure el context de `Staff`. Observeu també en escriure aquest valor tenim `##` abans de la clau d’obertura. Cal un `#` com a part de la sintaxi de les constants vectorials, i el primer símbol d’encoixinat `#` cal, com sempre, per precedir el valor mateix dins de l’ordre `\override`.

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.break-visibility = ##(#f #f #f)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

I podem veure que això també treu totes les línies divisòries.

#### La propietat `transparent` (transparent)

En la relació de propietats que s’especifiquen a la pàgina del `grob-interface` del RFI podem veure que la propietat `transparent` és un valor booleà. Això s’ha d’establir a `#t` per fer que el grob sigui transparent. A l’exemple següent farem que la indicació de compàs, i no les línies divisòries, siguin transparents. Per fer-lo hem de buscar el nom del grob de la indicació de compàs. Tornat a la pàgina ‘All layout objects’ del RFI, busquem les propietats de l’objecte de presentació `TimeSignature`. El produeix el gravador `Time_signature_engraver` que com podeu comprovar viu dins del context `Staff` i també contempla la interfície `grob-interface`. Així doncs, l’ordre que fa transparent a la indicació de compàs és:

>     \relative {
>       \time 12/16
>       \override Staff.TimeSignature.transparent = ##t
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Un cop més, l’establiment de la propietat `transparent` és una operació força freqüent, de manera que tenim una abreviatura anomenada `\hide` (ocultar):

>     \relative {
>       \time 12/16
>       \hide Staff.TimeSignature
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

En cap dels dos casos apareix ja la indicació de compàs, però aquesta ordre deixa una separació en el lloc on abans hi havia la indicació de compàs. Potser això és el que volem per a un exercici on l’alumne hagi d’escriure’l, però en altres circumstàncies aquesta separació podria no ser desitjable. En comptes d’això, per treure-la, el stencil o «segell» de la indicació de compàs s’ha d’establir al valor `#f`:

>     \relative {
>       \time 12/16
>       \omit Staff.TimeSignature
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

i la diferència és òbvia: en establir el segell al valor `#f` (possiblement per mitjà de `\omit` traiem l’objecte per complet; en fer l’objecte `transparent` (cosa que es pot fer utilitzant `\hide`) el deixen on és, però el fem invisible.

#### La propietat `color`

Per finalitzar, intentem fer invisibles les barres de compàs pintant-les de color blanc (hi ha un problema relacionat, que consisteix en què la línia divisòria blanca pot tapar o no tapar les línies del pentagrama amb les quals es creua. Podreu observar en alguns dels exemples que apareixen a continuació, que això succeeix de forma impredictible. Els detalls sobre perquè això passa així, i com controlar-lo, s’estudien a Pintar els objectes de blanc; de moment estem estudiant el color, per la qual cosa us preguem que accepteu aquesta limitació per ara).

La interfície `grob-interface` especifica que la propietat del color és una llista, però no hi ha cap explicació sobre el que ha d’anar a aquesta llista. La llista que requereix és realment una llista de valors en unitats internes, però per evitar haver de saber quines són, s’ofereixen diverses vies per a l’especificació dels colors. La primera forma és utilitzar un dels colors ‘normals’ dels quals es fa una relació a la primera taula de la Llista de colors. Per posar les línies divisòries de color blanc, escrivim:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #white
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

i un altre cop podem comprovar que les barres de compàs no són visibles. Observeu que white no ve precedit d’un apòstrof: no és un símbol, sinó una variable. Quan s’avalua, proporciona la llista de valors interns que es requereixen per establir el color a blanc. Els altres colores de la llista normal també són variables. Per convèncer-vos que això funciona, potser voleu canviar el color a una de les altres variables de la llista.

La segona forma de canviar el color és utilitzar la llista de noms de colores d’X11 que apareix a la segona llista de Llista de colors. De totes maneres, es fan correspondre als valors real per mitjà de la funció `x11-color` que converteix els símbols de color d’X11 a la llista de valors interns d’aquests colors:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #(x11-color 'white)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Observeu que en aquest cas la funció `x11-color` agafa un símbol com a argument, de manera que el símbol ha d’anar precedit d’un apòstrof per evitar que resulti avaluat com si fos una variable, i tota la crida a la funció s’ha de envoltar entre parèntesis.

Encara hi ha una altra funció, que converteix valors RGB en colors interns: la funció `rgb-color`. Agafa tres arguments que donen les intensitats de vermell, verd i blau. Cadascú d’ells pot agafar valors entre 0 i 1. Per tant, per establir el color a vermell, el valor ha de ser `(rgb-color 1 0 0)` i per a blanc ha de ser `(rgb-color 1 1 1)`:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #(rgb-color 1 1 1)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Finalment, hi ha també una escala de grisos com a part del conjunt de colors d’X11. Varien des del negre, `'grey0`, fins al blanc, `'grey100`, en passos de 1. Il·lustrarem això establint tots els objectes de presentació del nostre exemple a diverses gradacions de gris:

>     \relative {
>       \time 12/16
>       \override Staff.StaffSymbol.color = #(x11-color 'grey30)
>       \override Staff.TimeSignature.color = #(x11-color 'grey60)
>       \override Staff.Clef.color = #(x11-color 'grey60)
>       \override Voice.NoteHead.color = #(x11-color 'grey85)
>       \override Voice.Stem.color = #(x11-color 'grey85)
>       \override Staff.BarLine.color = #(x11-color 'grey10)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Observeu els contextos associats amb cadascú dels objectes de presentació. És important que estiguin correctament escrits, o les ordres no funcionaran. Recordeu que el context és aquell en el qual es troba el gravador corresponent. El context predeterminat per als gravadors pot trobar-se començant per l’objecte de presentació, d’aquí al gravador que el produeix, i a la pàgina del gravador del RFI apareix en quin context es pot trobar normalment el gravador.

#### LilyPond — Manual d’aprenentatge v2.24.4 (branca estable).