5.1.4 Optimierungsmethoden


Der \override-Befehl

Der \override-Befehl

Wir haben uns schon mit den Befehlen \set und \with bekannt gemacht, mit welchen Eigenschaften von Kontexten verändert und Engraver entfernt oder hinzugefügt werden können. Siehe dazu Kontexteigenschaften verändern und Engraver hinzufügen und entfernen. Jetzt wollen wir uns weitere wichtige Befehle anschauen.

Der Befehl, um die Eigenschaften von Layout-Objekten zu ändern, ist \override. Weil dieser Befehl interne Eigenschaften tief in der Programmstruktur von LilyPond verändern muss, ist seine Syntax nicht so einfach wie die der bisherigen Befehle. Man muss genau wissen, welche Eigenschaft welches Objektes in welchem Kontext geändert werden soll, und welches der neu zu setzende Wert dann ist. Schauen wir uns an, wie das vor sich geht.

Die allgemeine Syntax dieses Befehles ist:

\override Kontext.LayoutObjekt.layout-eigenschaft = #Wert

Damit wir die Eigenschaft mit der Bezeichnung layout-property das Layout-Objektes mit der BezeichnungLayoutObject, welches ein Mitglied des Kontext-Kontextes ist, auf den Wert value.

Der Kontext kann (und wird auch normalerweise) ausgelassen werden, wenn der benötigte Kontext eindeutig impliziert ist und einer der untersten Kontexte ist, also etwa Voice, ChordNames oder Lyrics. Auch in diesem Text wird der Kontext oft ausgelassen werden. Später soll gezeigt werden, in welchen Fällen er ausdrücklich definiert werden muss.

Spätere Abschnitte behandeln umfassend Eigenschaften und ihre Werte, siehe Typen von Eigenschaften. Aber um ihre Funktion und ihr Format zu demonstrieren, werden wir hier nur einige einfache Eigenschaften und Werte einsetzen, die einfach zu verstehen sind.

LilyPond’s hauptsächliche Ausdrücke sind musikalische Dinge wie Noten und Notendauern, sowie Zeichenketten und Markierungen. Diesen zugrunde liegende Ausdrücke wie Zahlen und Listen werden im ‚Scheme Modus‘ verarbeitet. Der Präfix ‘#’ leitet diesen Modus ein. Weiterführende Informationen zu LilyPond’s Scheme mode finden Sie unter LilyPond Scheme-Syntax.

\override ist der bei Optimierungen am häufigsten verwendete Befehl. Daher wird der Rest dieses Kapitels im Wesentlichen aus Anwendungsbeispielen dieses Befehls bestehen. Hier kommt gleich ein einfaches Beispiel zur Änderung der Farbe von Notenköpfen:

\relative {
  c'4 d
  \override NoteHead.color = "red"
  e4 f |
  \override NoteHead.color = "green"
  g4 a b c |
}

[image of music]


Der \revert-Befehl

Wenn eine Eigenschaft einmal überschrieben wurde, wird ihr neuer Wert so lange bewahrt, bis er noch einmal überschrieben wird oder ein \revert-Befehl vorkommt. Der \revert-Befehl hat die folgende Syntax und setzt den Wert der Eigenschaft zurück auf den Standardwert, nicht jedoch auf den vorigen Wert, wenn mehrere \override-Befehle benutzt wurden.

\revert Kontext.LayoutObjekt.layout-eigenschaft

Wiederum, genauso wie der Kontext bei dem \override-Befehl, wird Kontext oft nicht benötigt. Er wird in vielen der folgenden Beispiele ausgelassen. Im nächsten Beispiel wird die Farbe des Notenkopfes wieder auf den Standardwert für die letzten zwei Noten gesetzt.

\relative {
  c'4 d
  \override NoteHead.color = "red"
  e4 f |
  \override NoteHead.color = "green"
  g4 a
  \once \revert NoteHead.color
  b4 c |
  \revert NoteHead.color
  f2 c |
}

[image of music]


Der \once-Präfix

Sowohl der \override-Befehl als auch der \set-Befehl können mit dem Präfix \once (einmal) versehen werden. Dadurch wird der folgende \override- oder \set-Befehl nur für den aktuellen Musik-Moment wirksam, bevor sich wieder der vorherige Zustand herstellt (dieser kann sich vom Standard unterscheiden, wenn etwa noch ein anderer \override-Befehl aktiv ist). Am gleichen Beispiel demonstriert, kann damit die Farbe eines einzelnen Notenkopfes geändert werden:

\relative {
  c'4 d
  \override NoteHead.color = #red
  e4 f |
  \once \override NoteHead.color = #green
  g4 a
  \revert NoteHead.color
  b c |
}

[image of music]

Der \once Präfix eignet sich also dazu, die Geltungsdauer eines anderen vordefinierten Befehls, dem er vorangestellt ist, auf ein einziges musikalisches Ereignis zu beschränken:

\relative {
  c'4( d)
  \once \slurDashed
  e4( f) |
  g4( a)
  \once \hideNotes
  b( c) |
}

[image of music]


Der \tweak-Befehl

Der letzte Optimierungsbefehl in LilyPond ist \tweak (engl. optimieren). Er wird eingesetzt um Eigenschaften nur eines Objektes von mehreren Objekten zu verändern, die zum selben Musik-Zeitpunkt auftreten, wie etwa die Noten eines Akkordes. Ein \override würde alle Noten des Akkords beeinflussen, während mit \tweak nur das nächste Objekt der Eingabe geändert wird.

Hier ein Beispiel. Angenommen, die Größe des mittleren Notenkopfes (ein E) in einem C-Dur-Akkord soll geändert werden. Schauen wir zuerst, was wir mit \once \override erhalten:

\relative {
  <c' e g>4
  \once \override NoteHead.font-size = #-3
  <c e g>4
  <c e g>4
}

[image of music]

Wie man sehen kann, beeinflusst override alle Notenköpfe des Akkordes. Das liegt daran, dass alle die Noten eines Akkordes zum selben Musik-Moment auftreten und die Funktion von \once ist es, die Optimierung auf an allen Objekten auszuführen, die zum selben Musik-Moment auftreten wie der \override-Befehl.

Der \tweak-Befehl funktioniert anders. Er bezieht sich auf das direkt folgende Element in der Eingabe-Datei. In seiner einfachsten Form ist der Befehl nur an Objekten wirksam, die direkt vom vorhergehenden Element erstellt worden sind, insbesondere Notenköpfe und Artikulation.

Um also zu unserem Beispiel zurückzukommen, könnte man die mittlere Note eines Akkordes auf diese Weise ändern:

\relative {
  <c' e g>4
  <c \tweak font-size #-3 e g>4
}

[image of music]

Beachten Sie, dass die Syntax des \tweak-Befehls sich von der des \override-Befehls unterscheidet. Der Kontext dürfen nicht angegeben werden, denn das würde zu einem Fehler führen. Sowohl Kontext als auch das Layout-Objekt sind durch das folgende Element im Inputstream impliziert. Hier sollte auch kein Gleichheitszeichen vorhanden sein. Die verallgemeinerte Syntax des \tweak-Befehls ist also

\tweak layout-eigenschaft #Wert

Ein \tweak-Befehl kann auch benutzt werden, um nur eine von mehreren Artikulationen zu ändern, wie im nächsten Beispiel zu sehen ist.

a'4^"Black"
  -\tweak color "red" ^"Red"
  -\tweak color "green" _"Green"

[image of music]

Beachten Sie, dass ein Artikulationsmodifikator vor dem \tweak-Befehl geschrieben werden muss, weil auch der \tweak-Ausdruck als Artikulation angefügt wird. Im Falle von mehreren Richtungsmodifikatoren (^ or _) gilt der Modifikator links außen, weil er als letzter angefügt wird.

Objekte wie Hälse und Versetzungszeichen werden später erstellt und nicht direkt aus dem vorhergehenden Ereignis. Es ist dennoch möglich, \tweak mit solchen indirekt erstelltn Objekten zu verwenden, indem man die Layout-Objekte direkt benennt, vorausgesetzt dass LilyPond ihre Herkunft bis zu dem ursprünglichen Ereignis zurück verfolgen kann:

<\tweak Accidental.color "red"   cis''4
 \tweak Accidental.color "green" es''
 g''>

[image of music]

Diese Langform des \tweak-Befehls kann wie folgend beschrieben werden:

\tweak layout-object.layout-property value

Der \tweak-Befehl muss auch benutzt werden, wenn das Aussehen einer vor mehreren geschachtelten Triolenklammern geändert werden soll, die zum selben Zeitpunkt beginnen. Im folgenden Beispiel beginnen die lange Klammer und die erste Triolenklammer zum selben Zeitpunkt, sodass ein \override-Befehl sich auf beide beziehen würde. In dem Beispiel wird \tweak benutzt, um zwischen ihnen zu unterscheiden. Der erste \tweakBefehl gibt an, dass die lange Klammer über den Noten gesetzt werden soll, und der zweite, dass die Zahl der rhythmischen Aufteilung für die erste der kurzen Klammern in rot gesetzt wird.

\relative c'' {
  \tweak direction #up
  \tuplet 3/4 {
    \tweak color "red"
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
  }
}

[image of music]

Wenn geschachtelte N-tolen nicht zum gleichen Zeitpunkt beginnen, kann ihr Aussehen auf die übliche Art mit dem \override-Befehl geändert werden:

\relative {
  \tuplet 3/2 { c'8[ c c] }
  \once \override TupletNumber.text = #tuplet-number::calc-fraction-text
  \tuplet 3/2 {
    c8[ c]
    c8[ c]
    \once \override TupletNumber.transparent = ##t
    \tuplet 3/2 { c8[ c c] }
    \tuplet 3/2 { c8[ c c] }
  }
}

[image of music]

Siehe auch

Notationsreferenz: Der tweak-Befehl.


Der \single-Präfix

Nehmen wir einmal an, wir möchten bestimmte Noten betonen, indem wir ihre Köpfe rot einfärben und sie außerdem vergrößern. Damit das einfach zu machen ist nehmen wir ferner an, wir hätten dafür eine Funktion definiert:

emphNoteHead = {
  \override NoteHead.color = "red"
  \override NoteHead.font-size = 2
}
\relative {
  c''4 a \once \emphNoteHead f d |
}

[image of music]

Der \once Präfix funktioniert wunderbar, wenn es darum geht einzelne Noten oder ganze Akkorde zu betonen, jedoch versagt er, gilt es eine einzelne Note innerhalb eines Akkordes zu betonen. Wir haben schon gesehen, wie \tweak dennoch dazu gebracht werden kann, siehe Der \tweak-Befehl. Aber \tweak kann nicht auf eine Funktion angewandt werden; hier kommt \single ins Spiel:

emphNoteHead = {
  \override NoteHead.color = "red"
  \override NoteHead.font-size = 2
}
\relative {
   <c'' a \single \emphNoteHead f d>4
}

[image of music]

Zusammenfassend kann man sagen, \single wandelt overrides in tweaks sodass bei mehreren zeitgleichen musiklaischen Objekten (wie die Notenköpfe eines Akkords), man mit \single lediglich ein einzelnes Objekt beeinflusst, nämlich dasjenige, was im direkt folgenden musikalischen Ausdruck steckt. Das ist anders, als \once, welches alle diese Objekte beträfe.

Man kann so \single dafür verwenden, jede kleine Funktion, die lediglich overrides enthält auf einzelne Noten innerhalb eines Akkords anzuwenden. Es sei jedoch darauf hingewiesen, \single wandelt weder \revert, noch noch \set oder \unset in tweaks.

Siehe auch

Handbuch zum Lernen: Der \tweak-Befehl, Variablen für Layout Anpassungen einsetzen.


LilyPond – Learning Manual v2.24.4 (stabiler Zweig).