LilyPond 記譜法リファレンス: 5.1.6 新しいコンテキストを定義する

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

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

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

これらの設定は `\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` を、`Staff` と `RhythmicStaff` の定義に追加するのと同様の効果を示します。

`\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.24.4 (安定版).

- 2. 専門的な記譜法
- 3. 入出力全般
- 4. スペースの問題
- 5. デフォルトを変更する
- A. 付表
- B. カンニング ペーパー
- C. GNU Free Documentation License
- D. LilyPond コマンド インデックス
- E. LilyPond インデックス