[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Erscheinung von Objekten ] | [ Nach oben : Erscheinung von Objekten ] | [ Die stencil-Eigenschaft > ] |
5.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 Taktstriche zu entfernen, damit der Schüler sie selber zeichnen kann. Aber die Taktstriche 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 Eigenschaften, 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 Taktstriche zuständig ist. Über die Überschriften
Backend und All layout objects kommen
wir zu einem Layout-Objekt mit der Bezeichnung
BarLine
(engl. Taktstrich). 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 Taktstriche (und
natürlich auch die Sichtbarkeit von vielen anderen Objekten)
beeinflussen. Schauen wir uns diese Eigenschaften eine
nach der anderen an.
Die stencil -Eigenschaft (Matrize) | ||
The break-visibility -Eigenschaft (unsichtbar machen) | ||
Die transparent -Eigenschaft (durchsichtig) | ||
Die color -Eigenschaft (Farbe) |
[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Sichtbarkeit und Farbe von Objekten ] | [ Nach oben : Sichtbarkeit und Farbe von Objekten ] | [ Die break-visibility-Eigenschaft > ] |
Die stencil
-Eigenschaft (Matrize)
Diese Eigenschaft kontrolliert die Erscheinung der Taktstriche,
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:
\relative { \time 12/16 \override BarLine.stencil = ##f c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Die Taktstriche 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 Taktstrich-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:
\relative { \time 12/16 \override Staff.BarLine.stencil = ##f c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Jetzt sind die Taktstriche wirklich verschwunden. Setzen der
stencil
-Eigenschaft auf #f
wird derart häufig verwendet,
dass es dafür einen eigenen Befehl gibt, \omit
:
\relative { \time 12/16 \omit Staff.BarLine c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
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:
\relative { c''4 c \once \override NoteHead.stencil = #point-stencil c4 c }
[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Die stencil-Eigenschaft ] | [ Nach oben : Sichtbarkeit und Farbe von Objekten ] | [ Die transparent-Eigenschaft > ] |
The break-visibility
-Eigenschaft (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 Taktstriche am Ende einer Zeile,
in der Mitte einer Zeile und am Anfang einer Zeile ausgegeben
werden. Wenn also alle Taktstriche unsichtbar sein sollen, wie in
unserem Beispiel, brauchen wir den Wert #(#f #f #f)
, (den es auch
unter dem symbolischen Namen all-invisible
gibt).
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.
\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 }
Auch auf diesem Weg gelingt es, die Taktstriche unsichtbar zu machen.
[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Die break-visibility-Eigenschaft ] | [ Nach oben : Sichtbarkeit und Farbe von Objekten ] | [ Die color-Eigenschaft > ] |
Die transparent
-Eigenschaft (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 Taktstriche 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:
\relative { \time 12/16 \override Staff.TimeSignature.transparent = ##t c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Auch das Setzen der transparent
-Eigenschaft ist ein recht häufige
Operation und so gibt es auch hierfür eine Kurzform names \hide
:
\relative { \time 12/16 \hide Staff.TimeSignature c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
In beiden Fällen ist die Taktangabe ist verschwunden, aber mit diesem Befehl
bleibt freier Platz, 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 stattdessen 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: Setzen des stencil auf #f
(ggf.
mittels \omit
) entfernt das gesamte Objekt, während man mit
transparent
(was auch mittels \hide
eingestellt werden kann)
ein Objekt unsichtbar machen kann, es aber an seinem Platz gelassen wird.
[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Die transparent-Eigenschaft ] | [ Nach oben : Sichtbarkeit und Farbe von Objekten ] | [ Größe von Objekten > ] |
Die color
-Eigenschaft (Farbe)
Abschließend wollen wir die Taktstriche unsichtbar machen, indem wir sie weiß einfärben. (Es gibt hier eine Schwierigkeit: die weiße Taktstrich übermalt manchmal die Taktstriche, 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, „CSS“-Farben zu benutzen, wie sie
Liste der Farben
aufgelistet sind. Beachten Sie, dass die Bezeichnungen auf Englisch sind.
Um die Taktstriche auf weiß zu setzen, können Sie schreiben:
\relative { \time 12/16 \override Staff.BarLine.color = "white" c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
und die Taktstriche verschwinden in der Tat. Beachten Sie, dass white nicht mit einem Apostroph angeführt wird – es ist kein Symbol, sondern eine Zeichenkette, die einer vordefinierten Liste von internen Werten zugeordnet ist. Hier orierntiert LilyPonds Syntax sich an CSS, die oft auf Webseiten genutzt werden. Zusätzlich zu den vordefinierten Farben können wir auch hexadezimale Codes verwenden:
\relative { \time 12/16 \override Staff.BarLine.color = "#FFFFFF" c''4 b8 c d16 c d8 | g,8 a16 b8 c d4 e16 | e8 }
Wir könnten diese Farbe auch als Variable definieren und dann diese Variable benutzen, um die Eigenschaft zu definiren. Da es sowohl eine LilyPond-Variable ein Scheme-Objekt ist, kann es ohne Unterschied mit einem Backslash und einem Hash genutzt werden:
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 }
Ein weiterer Weg zum Hinzufügen von Farben zu einer Partitur
ist das Benutzen einer Funktion. Hier gibt es zwei nützliche
Funktionen; eine ist die Funktion x11-color
, die wir
in Kürze sehen werden. Die andere, rgb-color
, zeigt
LilyPonds interne Logik: 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)
.
\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 }
Es ist zu beachten, dass in diesem Fall der gesamte Funktionsaufruf
in Klammern eingeschlossen werden muss. Das gleiche kann über die
Funktion x11-color
gesagt werden, die wir übersprungen haben.
x11-color
ordnet ebenfalls vordefinierte Farbnamen
internen Werten zu – aber bietet viel mehr Auswahl als
CSS-Namen, wie in
Liste der Farben zu sehen ist.
Die Menge der X11-Farben schließt beispielsweise eine weite
Grauskala ein, die von schwarz ('grey0
) bis weiß
('grey100
) reicht, in Einerschritten. Wir wollen das
illustrieren, indem alle Layout-Objekte im Beispiel
verschiedene Grauschattierungen erhalten:
\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 }
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.
[ << Die Ausgabe verbessern ] | [Anfang][Inhalt][Index] | [ Vorlagen >> ] |
[ < Die transparent-Eigenschaft ] | [ Nach oben : Sichtbarkeit und Farbe von Objekten ] | [ Größe von Objekten > ] |