LilyPond Benutzerhandbuch: 5.1.6 Neue Kontexte definieren

### 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.

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 – Notationsreferenz v2.22.2 (stabiler Zweig).