5.1.6 新しいコンテキストを定義する

StaffVoice のようなコンテキストは、簡単なブロックの組み合わせで構成されています。 エングラーバ プラグインの組み合わせを変えることで、新しいタイプのコンテキスを作成することができます。

次の例は、ゼロからタイプの異なる Voice コンテキストを作り上げる方法を示しています。このコンテキストは Voice コンテキストに似ていますが、音符の代わりにスラッシュを譜の中央に譜刻します。これはジャズで即興を表すのに使うことができます。

[image of music]

これらの設定は \layout ブロック内部の \context ブロックの中で定義します:

\layout {
  \context {
    …
  }
}

以下では、上記の例の … に入るべき入力について議論します。

最初に、新しいコンテキストの名前を定義する必要があります:

\name ImproVoice

このコンテキストは Voice コンテキストに似せる必要があるため、(既存の) Voice コンテキストで動作するコマンドを同じように動作させる必要があります。これは、新しいコンテキストに Voice のエイリアスを与えることで実現できます。

\alias Voice

このコンテキストは音符と指示テキストを譜刻しますので、それらの機能を提供するエングラーバや、さらに同じタイミングで発生する音符・符幹・休符を列としてグループ化するエングラーバを付加する必要があります:

\consists Note_heads_engraver
\consists Text_engraver
\consists Rhythmic_column_engraver

符頭のスラッシュは譜の中央線上に配置される必要があります:

\consists Pitch_squash_engraver
squashedPosition = #0

Pitch_squash_engraver は (Note_heads_engraver によって作成される) 符頭を変更し、符頭の垂直位置を squashedPosition にセットします – 今回は 0、つまり中央線上です。

音符はスラッシュで、符幹を持ちません:

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

これらのプラグインすべてがコンテキストの下で協調する必要があります。コンテキストが協調するために用いるメカニズムは、コンテキストの \type を宣言することで確立することができます。\layout ブロックの中では、ほとんどのコンテキストは Engraver_group のタイプに属しています。いくつかの特殊なコンテキストや、\midi ブロックの中では別のコンテキスト タイプに属していることがあります。既存のコンテキスト定義をコピーし改変する場合には、タイプについても継承されます。この例では定義を 1 から作っているため、タイプを明示的に指定する必要があります:

\type Engraver_group

まとめると、以下のようになります:

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

コンテキストは階層を構成します。通常の Voice コンテキストと同様に、ImproVoice コンテキストを Staff コンテキストの中に置く必要があります。それゆえ、Staff の定義を \accepts コマンドで変更します:

\context {
  \Staff
  \accepts ImproVoice
}

既存のコンテキスト定義を使い回す場合があるかもしれません。その際、結果としてできるコンテキストは、元のコンテキストが使用できる場所であればどこでも使用できると有用です。

\layout {
  …
  \inherit-acceptability to from
}

このようにすることで、from を含めることのできるすべてのコンテキストが、to のコンテキストも含めることができるようになります。例えば:

\layout {
  …
  \inherit-acceptability "ImproVoice" "Voice"
}

これは、\accepts ImproVoice を、StaffRhythmicStaff の定義に追加するのと同様の効果を示します。

\accepts の反対は \denies です。これは既存のコンテキスト定義を再利用する場合に必要となります。

必要なパーツを \layout ブロックの中に置きます:

\layout {
  \context {
    \name ImproVoice
    …
  }
  \inherit-acceptability "ImproVoice" "Voice"
}

それから、このサブセクションの最初にあった出力を入力します:

\relative {
  a'4 d8 bes8
  \new ImproVoice {
    c4^"ad lib" c
    c4 c^"undress"
    c c_"while playing :)"
  }
  a1
}

この例を完成させるには、コンテキストの階層に影響する変更が \midi ブロックでも同様に記述される必要があります。そうすることで、MIDI 出力においてもコンテキスト間の関係が同様に定義されます。

参照

内部リファレンス: Note_heads_engraver, Text_engraver, Rhythmic_column_engraver, Pitch_squash_engraver


LilyPond — 記譜法リファレンス v2.23.82 (開発版).