Manuale di apprendimento di LilyPond: 5.3.1 Visibilità e colore degli oggetti

### 5.3.1 Visibilità e colore degli oggetti

Potremmo voler creare una partitura priva di alcuni elementi a scopo didattico, perché lo studente possa esercitarsi a inserirli. Vediamo un semplice esempio e immaginiamo che l’esercizio consista nell’inserire le stanghette mancanti di un brano. Ma di norma le stanghette sono inserite automaticamente: come lo possiamo impedire?

Prima di iniziare, occorre ricordare che le proprietà degli oggetti sono raggruppate nelle cosiddette interfacce – si veda Proprietà presenti nelle interfacce. Queste servono semplicemente a raggruppare quelle proprietà che possono essere usate insieme per modificare un oggetto grafico – se una di queste è ammessa per un oggetto, lo sono anche le altre. Alcuni oggetti usano le proprietà di alcune interfacce, altri quelle di altre interfacce. Le interfacce che contengono le proprietà usate da un particolare grob (oggetto grafico) sono elencate nella guida al Funzionamento interno in fondo alla pagina che descrive il grob; queste proprietà possono essere individuate consultando quelle interfacce.

In Proprietà degli oggetti di formattazione abbiamo spiegato come trovare le informazioni sui grob. Usando lo stesso approccio, andiamo nella guida al Funzionamento interno per trovare l’oggetto grafico relativo alla stanghetta (bar line). Passando da Backend e All layout objects troviamo un oggetto grafico chiamato `BarLine`. Tra le sue proprietà ce ne sono due che controllano la visibilità: `break-visibility` e `stencil`. Anche Barline supporta varie interfacce, tra cui la `grob-interface`, dove troviamo le proprietà `transparent` e `color`. Tutte queste proprietà hanno degli effetti sulla visibilità delle stanghette (e, ovviamente, anche di molti altri oggetti grafici). Vediamole una per volta.

#### La proprietà `stencil`

Questa proprietà controlla l’aspetto delle stanghette specificando il simbolo (glifo) da usare. Come nel caso di molte altre proprietà, si può far in modo che non usi nessun simbolo impostando il suo valore su `#f`. Proviamo, come prima, omettendo il contesto implicito, `Voice`:

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

Le stanghette sono ancora visibili. Cosa abbiamo sbagliato? Torna alla guida del Funzionamento interno e scorri di nuovo la pagina che elenca le proprietà di BarLine. In cima alla pagina dice “Barline objects are created by: Bar_engraver”. Vai alla pagina `Bar_engraver`. In fondo si trova una lista dei contesti nel quale opera l’incisore della battuta. Tutti questi sono di tipo `Staff`, dunque la ragione per cui il comando `\override` precedente non funziona è che `Barline` non si trova nel contesto predefinito, `Voice`. Se il contesto indicato non è corretto, il comando non funziona. Non viene generato alcun messaggio di errore e non viene registrato niente nel file di log. Proviamo a correggerlo specificando il contesto giusto:

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

Ora le stanghette sono sparite. Impostare la proprietà `stencil` su `#f` è un’operazione talmente frequente che è stata creata una scorciatoia, `\omit`:

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

Si noti però che impostare la proprietà `stencil` su `#f` causerà degli errori nel caso in cui le dimensioni dell’oggetto siano necessarie per elaborarlo correttamente. Ad esempio, si creano degli errori se la proprietà `stencil` dell’oggetto `NoteHead` è impostata su `#f`. In questo caso è possibile usare invece la funzione `point-stencil`, che trasforma lo stencil in un oggetto a dimensione zero:

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

#### La proprietà `break-visibility`

Nella pagina di `BarLine` della guida al Funzionamento interno vediamo che la proprietà `break-visibility` richiede un vettore di tre valori booleani. Questi valori controllano rispettivamente se le stanghette debbano comparire alla fine, in mezzo o all’inizio dei righi. Dato che nel nostro esempio vogliamo sopprimere tutte le stanghette, il valore che ci serve è `#(#f #f #f)` (equivalente al nome `all-invisible`). Proviamo, ricordando di includere il contesto `Staff`. Si noti che prima della parentesi di apertura abbiamo `##`. Un `#` è necessario perché introduce un vettore, mentre il primo `#` deve precedere, come sempre, il valore del comando `\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
>     }

E vediamo che anche questo comando elimina tutte le stanghette.

#### La proprietà `transparent`

Nelle proprietà specificate nella pagina `grob-interface` della guida al Funzionamento interno vediamo che la proprietà `transparent` è un booleano. Quindi deve essere impostata su `#t` («true», ’vero’) per rendere trasparente il grob. Nel prossimo esempio rendiamo trasparente il segno di tempo invece delle stanghette. Per farlo dobbiamo trovare il nome del grob del segno di tempo (in inglese time signature). Torniamo alla pagina ‘All layout objects’ per scoprire quali sono le proprietà dell’oggetto di formattazione `TimeSignature`. Tale grob è generato dall’incisore `Time_signature_engraver`, che opera nel contesto `Staff` e supporta l’interfaccia `grob-interface`. Quindi il comando che rende trasparente l’indicazione di tempo è:

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

Impostare la proprietà `transparent` è un’operazione piuttosto frequente, perciò è stata creata la scorciatoia `\hide`:

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

L’indicazione di tempo è scomparsa; è rimasto però uno spazio al suo posto. Magari questo è quello che si desidera, ad esempio per creare un esercizio in cui uno studente deve riempire degli spazi vuoti. Ma in altre circostanze ciò può non essere gradito. Per eliminare lo spazio vuoto bisogna impostare la proprietà stencil su `#f`:

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

la differenza è ovvia: se si imposta lo stencil su `#f` (possibilmente con `\omit`) l’oggetto scompare del tutto; se si rende l’oggetto `trasparente` questo resta dove è, anche se invisibile.

#### La proprietà `color`

Infine, proviamo a rendere le stanghette invisibili colorandole di bianco. (Si tratta di un metodo problematico perché la stanghetta bianca può imbiancare o meno le linee del rigo che incrocia. Puoi vedere in alcuni degli esempi successivi che questo accade in modo imprevedibile. I motivi per cui questo accade e il modo in cui è possibile controllarlo sono esposti in Dipingere gli oggetti di bianco. Ma per il momento stiamo imparando la proprietà color, quindi accettiamo questa limitazione.)

L’interfaccia `grob-interface` stabilisce che il valore della proprietà color è una lista, ma non spiega cosa debba essere questa lista. La lista di cui ha bisogno è in realtà una lista di valori in unità interne, ma per evitare di dover imparare quali siano queste unità vengono forniti vari modi di specificare un colore. Il primo modo consiste nell’usare uno dei colori ‘CSS’ predefiniti elencati in Elenco dei colori. Per rendere bianche le stanghette scriviamo:

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

e di nuovo vediamo che le stanghette non sono visibili. Si noti che white non è preceduto da un apostrofo, perché non è un simbolo, bensì una stringa, associata a un elenco predefinito di valori interni. In questo caso la sintassi di LilyPond imita il linguaggio CSS comunemente usato nelle pagine web; oltre ai nomi predefiniti, è possibile specificare un codice colore esadecimale:

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

Potremmo perfino definire questo colore in una variabile e poi usare questa variabile come definizione di proprietà. Essendo sia una variabile LilyPond che un oggetto Scheme, può essere preceduta indifferentemente da una barra inversa o dal cancelletto:

>     whiteVar = "#FFFFFF"

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

Un altro modo di aggiungere colori a una partitura consiste nell’uso di una funzione. Esistono due funzioni utili a questo proposito: una è la funzione `x11-color`, che impareremo a usare tra poco. L’altra, la funzione `rgb-color`, dimostra bene la logica interna di LilyPond: prende tre argomenti che specificano l’intensità dei colori rosso, verde e blu. I valori vanno da 0 a 1. Quindi per avere il colore rosso il valore sarà `(rgb-color 1 0 0)` e per avere il bianco sarà `(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
>     }

Notare che in questo caso l’intera chiamata alla funzione deve essere racchiusa tra parentesi. Lo stesso vale per la funzione `x11-color` che abbiamo appena saltato.

`x11-color` associa i nomi di colore predefiniti a valori interni – ma offre molte più scelta dei nomi CSS, come si può vedere in Elenco dei colori. Per esempio, l’insieme di colori X11 include un’ampia scala di grigi, i cui nomi vanno dal nero, `'grey0`, al bianco, `'grey100`, con cadenza di 1. Ecco un esempio in cui tutti gli oggetti di formattazione sono impostati su diverse tonalità di grigio:

>     \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
>     }

Nota i contesti associati a ciascuno degli oggetti di formattazione. È importante scegliere quelli giusti, altrimenti i comandi non funzioneranno! Ricorda, il contesto è quello in cui si trova il relativo incisore. Il contesto predefinito per gli incisori si trova partendo dall’oggetto di formattazione (layout object) per poi andare all’incisore che lo produce: la pagina dell’incisore nella guida al Funzionamento interno riporterà a quale contesto appartenga di norma l’incisore.

#### LilyPond — Manuale di apprendimento v2.24.4 (ramo stabile).