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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]


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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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
}

[image of music]

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.23.82 (ramo di sviluppo).