GNU LilyPond 学習マニュアル: 3.3.4 コンテキスト プロパティを変更する

### 3.3.4 コンテキスト プロパティを変更する

コンテキストにはいくつかのコンテキスト プロパティを保持する責任があります。それらプロパティの多くは変更可能であり、変更することで入力の構文解釈に影響を与えて出力の見た目を変化させます。それらプロパティは \set コマンドによって変更されます。これは以下のような形で行います:

>     \set ContextName.propertyName = #value

ontextName には通常、`Score`, `Staff` or `Voice` が入ります。これを省略する場合もあり、そのような場合は `Voice` であると見なされます。

コンテキスト プロパティの名前はハイフンやアンダスコアを使わずに連結された単語によって形成され、最初の単語を除いて単語の最初の文字は大文字になります。ここで、一般的に使用されるコンテキスト プロパティの例をいくつか挙げます。実際には、コンテキスト プロパティはもっとたくさんあります。

プロパティ名 | タイプ | 機能 | 実際の値の例
--- | --- | --- | ---
extraNatural | ブール値 | 真の場合、追加のナチュラル記号を臨時記号の前にセットします | `#t`, `#f`
currentBarNumber | 整数 | 小節番号をセットします | `50`
doubleSlurs | ブール値 | 真の場合、音符の上と下の両方にスラーを譜刻します | `#t`, `#f`
instrumentName | テキスト | 譜表の先頭に表示される名前をセットします | `"Cello I"`
fontSize | 実数 | フォント サイズを増減させます | `2.4`
stanza | テキスト | 歌詞の先頭に譜刻されるテキストをセットします | `"2"`

ここでのブール値とは真 (`#t`) または偽 (`#f`) のどちらかであり、整数とは正の整数であり、実数とは正または負の小数点付きの数であり、テキストはダブル アポストロフィで囲まれます。ハッシュ記号 (`#`) が 2 つの異なる箇所で出現することに注意してください – ブール値での `t` や `f` の前と、`\set` での値の前です。そのため、`\set` の値にブール値を挿入する場合、ハッシュ記号が 2 つ必要になります – つまり `##t` です。

これらのプロパティのいずれかをセットする前に、それらが操作するコンテキストはどれなのかを知る必要があります。これは明らかな場合もありますが、ややこしい場合もあります。間違ったコンテキストが指定された場合、エラー メッセージは表示されませんが、予期したアクションが起こりません。例えば、`instrumentName` は間違いなく `Staff` コンテキストの中にきます。なぜなら、このプロパティが名前を付けるのは譜表だからです。以下の例では、最初の譜表には名前が付けられていますが、2 番目の譜表には付けられていません。なぜなら、コンテキスト名を省略しているからです。

>     <<
>       \new Staff \relative c'' {
>         \set Staff.instrumentName = #"Soprano"
>         c2 c
>       }
>       \new Staff \relative c' {
>         \set instrumentName = #"Alto"  % Wrong!
>         d2 d
>       }
>     >>

デフォルトのコンテキスト名は `Voice` であることを思い出してください。このため、2 番目の `\set` コマンドは `Voice` コンテキストのプロパティ `instrumentName` を “Alto” にセットしています。しかしながら、LilyPond は `Voice` コンテキストでそのようなプロパティを見つけ出さないため、何のアクションも起こしません。これはエラーではなく、ログ ファイルにエラー メッセージは残りません。

同様に、プロパティ名の綴りを間違えた場合もエラー メッセージは表示されず、予期したアクションが起こりません。実際のところ、`\set` コマンドを使って、存在するいかなるコンテキストにでも、いかなる (架空の) ‘プロパティ’ をセットすることができます。しかしながら、そのプロパティ名を LilyPond が知らない場合、何のアクションも起こしません。LilyPond 入力ファイルに対する特別なサポートを持ついくつかのテキスト エディタは、あなたがプロパティ名の上にマウスを持ってくるとバレット (テキストの先頭に付く小丸) 付きのプロパティ名を表示してそのプロパティの裏づけを行い (LilyPondTool を持つ JEdit)、あるいは未知のプロパティ名をハイライトします (ConTEXT)。そのような機能を持つエディタを使用していないのなら、内部リファレンスでプロパティ名をチェックすることを推奨します: Tunable context properties や Contexts を参照してください。

`instrumentName` プロパティは `Staff` コンテキストの中にセットされた場合にのみ効果を持ちますが、いくつかのプロパティは複数のコンテキストの中にセットすることができます。例えば、プロパティ `extraNatural` はすべての譜に対してデフォルトで `##t` (真) にセットされています。ある特定の `Staff` コンテキストでこれを `##f` (偽) にセットした場合、その譜表の臨時記号にのみ適用されます。これを `Score` コンテキストにセットした場合、すべての譜に適用されます。

それでは、ある譜表の追加ナチュラル記号を消してみます:

>     <<
>       \new Staff \relative c'' {
>         ais2 aes
>       }
>       \new Staff \relative c'' {
>         \set Staff.extraNatural = ##f
>         ais2 aes
>       }
>     >>

さらに、すべての譜の追加ナチュラル記号を消します:

>     <<
>       \new Staff \relative c'' {
>         ais2 aes
>       }
>       \new Staff \relative c'' {
>         \set Score.extraNatural = ##f
>         ais2 aes
>       }
>     >>

他の例としては、`clefOctavation` が `Score` コンテキストにセットされた場合、直ちにすべての譜でのオクターブの値を変更し、すべての譜に適用される新しいデフォルト値をセットします。

逆のことを行うコマンド `\unset` はコンテキストからプロパティを削除し、それによりたいていのプロパティはデフォルト値に戻ります。通常、望みのことを達成するために新たな `\set` コマンドを用いる場合、`\unset` は必要ありません。

`\set` と `\unset` コマンドは入力ファイルのどこにでも現れる可能性があり、そのコマンドが出現した時点から、楽譜の終わりまたはそのプロパティが再度 `\set` や `\unset` されるまで効果を持ちます。フォント サイズを変更してみましょう。それにより (他のものに加えて) 符頭のサイズが何段階か変更されます。変更は直前にセットされた値から行われるのではなく、デフォルト値から行われます。

>     c4 d
>     % 符頭を小さくします
>     \set fontSize = #-4
>     e4 f |
>     % 符頭を大きくします
>     \set fontSize = #2.5
>     g4 a
>     % デフォルトのサイズに戻します
>     \unset fontSize
>     b4 c |

これまでにいくつかのタイプのプロパティ値をセットする方法を見てきました。整数と番号の前には常にハッシュ記号 `#` が付き、真と偽の値は 2 つのハッシュ記号を付けて `##t` と `##f` によって指定されてるということに注意してください。テキスト プロパティは上で示したようにダブル クォーテーションによって囲まれます。しかしながら、後ほど、テキストは実際には非常に強力な `\markup` コマンドを用いたもっと一般的な方法で指定できるということを見ていきます。

#### `\with` を使ったコンテキスト プロパティの設定

コンテキスト プロパティはコンテキストが作成されるときにセットされることもあるかもしれません。この設定がコンテキスト全体で保持される場合、この方法でプロパティ値を指定すると明瞭になります。コンテキストが `\new` コマンドで作成されるとき、その直後に `\with { .. }` ブロックが続き、その中でプロパティ値がセットされるかもしれません。例えば、ある譜表全体で追加のナチュラルの表示を抑制しようとする場合、以下のように書きます:

>     \new Staff \with { extraNatural = ##f }

like this:

>     <<
>       \new Staff {
>         \relative c'' {
>           gis4 ges aes ais
>         }
>       }
>       \new Staff \with { extraNatural = ##f } {
>         \relative c'' {
>           gis4 ges aes ais
>         }
>       }
>     >>

この方法でプロパティをセットした場合でも、`\set` を使って動的に変更されたり、`\unset` を使ってデフォルト値に戻されたりするかもしれません。

`fontSize` プロパティの扱いは異なります。これが `\with` の中でセットされた場合、フォント サイズのデフォルト値をセットし直します。そのあとでフォント サイズが `\set` によって変更された場合、`\with` でセットされた新しいデフォルト値は `\unset fontSize` コマンドによって元に戻されるかもしれません。

#### `\context` を使ったコンテキスト プロパティの設定

コンテキスト プロパティの値は単一のコマンドによってある特定のタイプのコンテキストすべて – すべての `Staff` コンテキストなどのように – にセットされるかもしれません。プロパティをセットするコンテキストのタイプは、`Staff` のようなそのコンテキストのタイプ名に接頭辞としてバック スラッシュを付けたもの – `\Staff` のように – によって指定されます。プロパティ値をセットするための記述は上で紹介した `\with` ブロックの中の記述と同じです。この記述は `\layout` ブロック内部の `\context` ブロックの中に置かれます。各 `\context` ブロックは、その `\layout` ブロックが置かれている `\score` または `\book` ブロック全体を通じて、指定されたタイプのコンテキストすべてに対して効果を持ちます。ここで、記述方法を示すための例を挙げます:

>     \score {
>       \new Staff {
>         \relative c'' {
>           cis4 e d ces
>         }
>       }
>       \layout {
>         \context {
>           \Staff
>           extraNatural = ##t
>         }
>       }
>     }

プロパティのオーバライドが score の中にあるどの譜にも適用されない場合:

>     \score {
>       <<
>         \new Staff {
>           \relative c'' {
>             gis4 ges aes ais
>           }
>         }
>         \new Staff {
>           \relative c'' {
>             gis4 ges aes ais
>           }
>         }
>       >>
>       \layout {
>         \context {
>           \Score extraNatural = ##f
>         }
>       }
>     }

この方法でセットされたコンテキスト プロパティは、`\with` ブロックの中の記述によって、さらには、音楽表記の中に埋め込まれた `\set` コマンドによって、ある特定のコンテキスト インスタンスでは上書きされるかもしれません。

#### 参照

記譜法リファレンス: Changing context default settings, The set command

内部リファレンス: Contexts, Tunable context properties

他の言語: English, česky, deutsch, español, français, magyar, italiano, nederlands

#### LilyPond — 学習マニュアル