5.1.6 Neue Kontexte definieren

Bestimme Kontexte, wie Staff oder Voice, werden erstellt, indem man sie mit einer Musikumgebung aufruft. Es ist aber auch möglich, eigene neue Kontexte zu definieren, in denen dann unterschiedliche Engraver benutzt werden.

Das folgende Beispiel zeigt, wie man etwa Voice-Kontexte von Grund auf neu bauen kann. Ein derartiger Kontext ähnelt Voice, es werden aber nur zentrierte Schrägstriche als Notenköpfe ausgegeben. Das kann benutzt werden, um Improvisation in Jazzmusik anzuzeigen.

[image of music]

Diese Einstellungen werden innerhalb der \context-Umgebung innerhalb der \layout-Umgebung definiert:

\layout {
  \context {
    …
  }
}

Der Beispielcode des folgenden Abschnittest muss anstelle der Punkte im vorigen Beispiel eingesetzt werden.

Zuerst ist es nötig eine Bezeichnung für den neuen Kontext zu definieren:

\name ImproVoice

Weil dieser neue Kontext ähnlich wie Voice ist, sollen die Befehle, die in Voice-Kontexten funktionieren, auch in dem neuen Kontext funktionieren. Das wird erreicht, indem der Kontext als Alias Voice erhält:

\alias Voice

Der Kontext gibt Noten und Text aus, darum müssen wir die Engraver hinzufügen, die für diese Aktionen zuständig sind:

\consists Note_heads_engraver
\consists Text_engraver

aber die Noten sollen nur auf der mittleren Linie ausgegeben werden:

\consists Pitch_squash_engraver
squashedPosition = #0

Der Pitch_squash_engraver verändert Notenköpfe (die vom Note_heads_engraver erstellt werden) und setzt ihre vertikale Position auf den Wert von squashedPosition, in diesem Fall ist das die Mittellinie.

Die Noten sehen wie ein Querstrich aus und haben keine Hälse:

\override NoteHead.style = #'slash
\hide Stem

Alle diese Engraver müssen zusammenarbeiten, und das wird erreicht mit einem zusätzlichen Plugin, das mit dem Befehl \type gekennzeichnet werden muss. Dieser Typ solle immer Engraver_group lauten:

\type Engraver_group

Alles zusammen haben wir folgende Einstellungen:

\context {
  \name ImproVoice
  \type Engraver_group
  \consists Note_heads_engraver
  \consists Text_engraver
  \consists Pitch_squash_engraver
  squashedPosition = #0
  \override NoteHead.style = #'slash
  \hide Stem
  \alias Voice
}

Kontexte sind hierarchisch. Wie wollen, dass ImproVoice sich als Unterkontext von Staff erkennt, wie eine normale Stimme. Darum wird die Definition von Staff mit dem \accepts-Befehl verändert:

\context {
  \Staff
  \accepts ImproVoice
}

Das Gegenteil von \accepts ist \denies (verbietet), was manchmal gebraucht werden kann, wenn schon existierende Kontext-Definitionen wieder benutzt werden sollen.

Beide Definitionen müssen in die \layout-Umgebung geschrieben werden:

\layout {
  \context {
    \name ImproVoice
    …
  }
  \context {
    \Staff
    \accepts ImproVoice
  }
}

Jetzt kann die Notation zu Beginn des Abschnitts folgendermaßen notiert werden:

\relative {
  a'4 d8 bes8
  \new ImproVoice {
    c4^"ad lib" c
    c4 c^"ausziehen"
    c c_"während des Spielens :)"
  }
  a1
}

LilyPond Benutzerhandbuch v2.25.22 (development-branch).