[ << デフォルトを変更する ] | [Top][Contents][Index] | [ 付表 >> ] |
[ < 適用順序 ] | [ Up : コンテキストを理解する ] | [ コンテキストの配置順序 > ] |
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
[ << デフォルトを変更する ] | [Top][Contents][Index] | [ 付表 >> ] |
[ < 適用順序 ] | [ Up : コンテキストを理解する ] | [ コンテキストの配置順序 > ] |