LilyPond Handbuch zum Lernen: 4.3.1 Sichtbarkeit und Farbe von Objekten

### 4.3.1 Sichtbarkeit und Farbe von Objekten

In Unterrichtsmaterial für den Musikunterricht wird oft eine Partitur dargestellt, in der bestimmte Notationselemente fehlen, so dass der Schüler die Aufgabe bekommt, die nachzutragen. Ein einfaches Beispiel ist etwa, die Taktlinien zu entfernen, damit der Schüler sie selber zeichnen kann. Aber die Tatklinien werden normalerweise automatisch eingefügt. Wie verhindern wir, dass sie ausgegeben werden?

Bevor wir uns hieran machen, sei daran erinnert, dass Objekteigenschaften in sogenannten Schnittstellen – engl. interface – gruppiert sind, siehe auch die Schnittstellen besitzen können. Das dient ganz einfach dazu, die Eigenschaften zusammenzufassen, die üblicherweise zusammen benötigt werden – wenn eine davon für ein Objekt gilt, dann auch die anderen. Manche Objekte brauchen die Eigenschaften von der einen Schnittstelle, andere von einer anderen. Die Schnittstellen, die die Eigenschaften von einem bestimmten Grob beinhalten, sind in der IR unten auf der Seite aufgelistet, die dieses Grob beschreibt. Die Eigenschaften können betrachtet werden, indem die Seite der entsprechenden Schnittstelle geöffnet wird.

Zu Information, wie man Eigenschaften von Grobs findet, siehe Eigenschaften von Layoutobjekten. Wir benutzen also jetzt die selbe Methode um in der IR das Layout-Objekt zu finden, dass für die Tatklinien zuständig ist. Über die Überschriften Backend und All layout objects kommen wir zu einem Layout-Objekt mit der Bezeichnung `BarLine` (engl. TaktLinie). Seine Eigenschaften beinhalten zwei, die über die Sichtbarkeit entscheiden: `break-visibility` und `stencil`. `BarLine` unterstützt auch einige Schnittstellen, unter anderem `grob-interface`, wo wir eine `transparent` und eine `color`-Eigenschaft finden. Alle können die Sichtbarkeit von Taktlinien (und natürlich auch die Sichtbarkeit von vielen anderen Objekten) beeinflussen. Schauen wir uns diese Eigenschaften eine nach der anderen an.

### stencil (Matrize)

Diese Eigenschaft kontrolliert die Erscheinung der Taktlinien, indem sie das Symbol bestimmt, das ausgegeben werden soll. Wie bei vielen anderen Eigenschaften auch, kann sie so eingestellt werden, dass sie nichts ausgibt, indem ihr Wert auf `#f` (falsch) gesetzt wird. Ein Versuch also, wie vorher, indem wir den impliziten Kontext (`Voice`) auslassen:

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

Die Taktlinien werden aber immer noch angezeigt. Was ist da falsch gelaufen? Gehen Sie zurück zur IR und schauen Sie auf die Seite, die die Eigenschaften für `BarLine` angibt. Oben auf der Seite steht: „Barline objects are created by: Bar_engraver“. Schauen Sie sich die `Bar_engraver`-Seite an. Unten auf der Seite steht eine Liste der Kontexte, in denen der Takt-Engraver funktioniert. Alle Kontexte sind `Staff`-Typen (also Notensystem-Typen). Der Grund, warum der `\override`-Befehl nicht funktioniert hat, liegt also darin, dass das Taktlinie-Objekt (`BarLine`) sich nicht im `Voice`-Kontext befindet. Wenn der Kontext falsch angegeben wird, bewirkt der Befehl einfach gar nichts. Keine Fehlermeldung wird ausgegeben und auch nichts in die Log-Datei geschrieben. Versuchen wir also, den richtigen Kontext mit anzugeben:

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

Jetzt sind die Taktlinien wirklich verschwunden.

Es sollte jedoch beachtet werden, dass das Setzen der `stencil`-Eigenschaft auf `#f` zu Fehlerhinweisen führen kann, wenn die Dimensionen des Objekts für die richtige Behandlung benötigt werden. Zum Beispiel werden Fehler ausgegeben, wenn die `stencil`-Eigenschaft des `NoteHead`-Objekts auf `#f` gesetzt wird. Wenn dieser Fall auftritt, kann anstatt dessen die `point-stencil`-Funktion benutzt werden, welche den Stencil auf ein Objekt mit der Größe Null setzt:

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

### break-visibility (unsichtbar machen)

Aus der Beschreibung der Eigenschaften für `BarLine` in der IR geht hervor, dass die `break-visibility`-Eigenschaft einen Vektor mit drei Booleschen Werten benötigt. Diese kontrollieren jeweils, ob die Taktlinien am Ende einer Zeile, in der Mitte einer Zeile und am Anfang einer Zeile ausgegeben werden. Wenn also alle Taktlinien unsichtbar sein sollen, wie in unserem Beispiel, brauchen wir den Wert `'#(#f #f #f)`. Versuchen wir es also, und berücksichtigen wir auch den `Staff`-Kontext. Beachten Sie auch, dass Sie `#'#` vor der öffnenden Klammer schreiben müssen: `'#` wird benötigt als Teil des Wertes, um einen Vektor zu signalisieren, und das erste `#` wird benötigt, um den Wert in einem `\override`-Befehl anzuführen.

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

Auch auf diesem Weg gelingt es, die Taktlinien unsichtbar zu machen.

### transparent (durchsichtig)

Aus den Eigenschaftsdefinitionen auf der `grob-interface`-Seite in der IR geht hervor, dass die `transparent`-Eigenschaft boolesch ist. Mit `#t` (wahr) wird also ein Grob durchsichtig gemacht. Im unserem Beispiel soll jetzt die Taktart durchsichtig gemacht werden, anstatt die Taktlinien durchsichtig zu machen. Wir brauchen also wieder die Grob-Bezeichnung für die Taktart. Auf der „All layout objects“-Seite in der IR müssen wir die Eigenschaften des `TimeSignature`-Layout-Objekts suchen Das Objekt wird vom `Time_signature_engraver` erstellt, der sich auch im `Staff`-Kontext befindet und genauso das `grob-interface` unterstützt, wie Sie sich überzeugen können. Der Befehl, um die Taktangabe unsichtbar zu machen, ist also:

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

Die Taktangabe ist verschwunden, aber mit diesem Befehl wird ein freier Platz gelassen, wo sich die Taktangabe eigentlich befinden würde. Das braucht man vielleicht für eine Schulaufgabe, in der die richtige Taktangabe eingefügt werden soll, aber in anderen Fällen ist diese Lücke nicht schön. Um auch die Lücke zu entfernen, muss die Matrize (stencil) der Taktangabe auf `#f` (falsch) gesetzt werden:

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

Und der Unterschied wird deutlich: hiermit wird das gesamte Objekt entfernt, während man mit `transparent` ein Objekt unsichtbar machen kann, es aber an seinem Platz gelassen wird.

### color (Farbe)

Abschließend wollen wir die Taktlinien unsichtbar machen, indem wir sie weiß einfärben. (Es gibt hier eine Schwierigkeit: die weiße Taktlinie übermalt manchmal die Taktlinien, wo sie sie kreuzt, manchmal aber auch nicht. Sie können in den Beispielen unten sehen, dass das nicht vorhersagbar ist. Die Einzelheiten dazu, warum das passiert und wie sie es kontrollieren können, werden dargestellt in Objekte weiß malen. Im Moment wollen wir lernen, wie man mit Farbe arbeitet, akzeptieren Sie bitte an dieser Stelle die Beschränkung.)

Das `grob-interface` bestimmt, dass der Wert der Farb-Eigenschaft eine Liste ist, aber es gibt keine Erklärung, was für eine Liste das sein soll. Die Liste, die benötigt wird, ist eine Liste mit Werten in internen Einheiten, aber damit Sie nicht wissen müssen, wie diese aussehen, gibt es mehrere Wege, Farben anzugeben. Der erste Weg ist es, „normale“ Farben zu benutzen, wie sie in der Tabelle in Liste der Farben aufgelistet sind. Beachten Sie, dass die Bezeichnungen auf Englisch sind. Um die Taktlinien auf weiß zu setzen, können Sie schreiben:

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

und die Taktlinien verschwinden in der Tat. Beachten Sie, dass white nicht mit einem Apostroph angeführt wird – es ist kein Symbol, sondern eine Funktion. Wenn sie aufgerufen wird, stellt sie eine Liste mit internen Werten zu Verfügung, mit welcher die Farbe auf weiß gestellt wird. Die anderen Farben in der Liste sind auch Funktionen. Um sich zu überzeugen, dass der Befehl auch wirklich funktioniert, können Sie die Farbe auf eine der anderen Funktionen dieser Liste abändern.

Die zweite Art die Farbe zu ändern geschieht, indem die Liste der X11-Farbbezeichnungen einzusetzen, siehe die zweite Liste in Liste der Farben. Diesen Farben muss jedoch eine andere Funktion vorangestellt werden, die die X11-Farbbezeichnungen in interne Werte konvertiert: `x11-color`. Das geschieht wie folgt:

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

In diesem Fall hat die Funktion `x11-color` ein Symbol als Argument, darum muss dem Symbol ein Apostroph vorangestellt und beide zusammen in Klammern gesetzt werden.

Es gibt noch eine dritte Funktion, die RGB-Werte in die internen Werte übersetzt – die `rgb-color`-Funktion. Sie braucht drei Argumente, um die Stärke von Rot, Grün und Blau darzustellen. Die Werte befinden sich zwischen 0 und 1. Um also die Farbe Rot darzustellen, muss der Wert der Funktion lauten: `(rgb-color 1 0 0)`, weiß würde sein: `(rgb-color 1 1 1)`.

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

Schließlich gibt es noch eine Grauskala, die zu den X11-Farben gehört. Sie reicht von schwarz (`'grey0'`) bis weiß (`'grey100`), in Einerschritten. Wir wollen das illustrieren, indem alle Layout-Objekte im Beispiel verschiede Grauschattierungen erhalten:

>     {
>       \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)
>       c4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

Beachten Sie die Kontexte, die mit jedem einzelnen Layout-Objekt verbunden sind. Es ist wichtig, den richtigen Kontext einzusetzen, damit die Befehle funktionieren. Denken Sie daran, dass der Kontext sich daran orientiert, wo sich der entsprechende Engraver befindet. Den Standardkontext für Engraver finden Sie, indem Sie beim Layout-Objekt beginnen, zum Engraver gehen, der es produziert und auf der Seite des Engravers in der IR finden Sie Information, in welchem Kontext sich der Engraver normalerweise befindet.

Andere Sprachen: English, česky, español, français, italiano, 日本語, nederlands.

#### LilyPond – Learning Manual