LilyPond 記譜法リファレンス: 5.4.7 オブジェクトの可視性

### 5.4.7 オブジェクトの可視性

レイアウト オブジェクトの可視性を制御する主な方法は 4 つあります: オブジェクトのステンシルを削除する方法、オブジェクトを透明にする方法、オブジェクトの色を白にする方法、あるいは、オブジェクトの `break-visibility` プロパティをオーバライドする方法です。 最初の 3 つの方法はすべてのレイアウト オブジェクトに適用されますが、最後の方法はいくつかの – 改行可能な オブジェクト – だけに適用されます。学習マニュアルでは、これら 4 つのテクニックについて紹介しています。 オブジェクトの可視性と色 を参照してください。

さらに、特定のレイアウト オブジェクト特有のテクニックがいくつかあります。それらについては、特別な考慮でカバーされています。

#### ステンシルを削除する

レウアウト オブジェクトはそれぞれステンシル プロパティを持ちます。デフォルトでは、このプロパティはそのオブジェクトを描画する特殊な関数にセットされています。このプロパティが `#f` にオーバライドされた場合、関数は呼び出されず、そのオブジェクトは描画されません。`\revert` でデフォルトの動作に戻すことができます。

>     a1 a
>     \override Score.BarLine.stencil = ##f
>     a a
>     \revert Score.BarLine.stencil
>     a a a

これはよく使う操作であるため、`\omit` という短縮記法が存在します:

>     a1 a
>     \omit Score.BarLine
>     a a
>     \undo \omit Score.BarLine
>     a a a

#### オブジェクトを透明にする

レイアウト オブジェクトはそれぞれ `transparent` プロパティを持っていて、デフォルトでは `#f` にセットされています。`#t` にセットされると、そのオブジェクトはスペースを占めたままですが、不可視になります。

>     a'4 a'
>     \once \override NoteHead.transparent = ##t
>     a' a'

これにも `\hide` という短縮記法があります:

>     a'4 a'
>     \once \hide NoteHead
>     a' a'

#### オブジェクトを白で描く

レイアウト オブジェクトはそれぞれ `color` プロパティを持っていて、デフォルトでは `black` にセットされています。このプロパティが `white` にセットされてると、そのオブジェクトは白い背景と区別が付かなくなります。しかしながら、そのオブジェクトが他のオブジェクトと交差している場合、交差している場所の色はオブジェクトの描画順序によって決定されます。これにより、以下に示すように、白いオブジェクトの画像が幽霊のように浮かび上がることがあります:

>     \override Staff.Clef.color = #white
>     a'1

オブジェクトの描画順序を変更することにより、これを回避することができます。すべてのレイアウト オブジェクトは `layer` プロパティを持っており、このプロパティには整数がセットされています。より小さな値の `layer` を持つオブジェクトが最初に描画され、より大きな値の `layer` を持つオブジェクトが後になってから描画されます。このため、より大きな値を持つオブジェクトがより小さな値を持つオブジェクトを上書きします。デフォルトでは、たいていのオブジェクトの `layer` には `1` が代入されています。しかしながら、いくつかのオブジェクト – `StaffSymbol` や `BarLine` など – には `0` が代入されています。同じ値の `layer` を持つオブジェクトを描画する順番は不確定です。

上記の例において、白い音部記号 (この `layer` のデフォルト値は `1` です) は譜線 (この `layer` のデフォルト値は `0` です) の後に描画されます。そのため、音部記号は譜線を上書きしています。これを変更するには、`Clef` オブジェクトの `layer` により小さな値 – 例えば、`-1` – を与えて、音部記号を先に描画させる必要があります:

>     \override Staff.Clef.color = #white
>     \override Staff.Clef.layer = #-1
>     a'1

#### break-visibility を用いる

たいていのレイアウト オブジェクトは 1 回だけ描画されます。しかしながら、小節線、音部記号、拍子記号、それに調号などのオブジェクトは、改行が起こると 2 回描画する必要があります – 行の最後で 1 回、次の行の最初でもう 1 回。そのようなオブジェクトは 改行可能 と呼ばれ、それらのオブジェクトが描画される可能性がある 3 つの場所 – 行の先頭、行の途中 (それらが変更された場合)、それに、行の最後 (そこで変更が行われた場合) – における可視性を制御する `break-visibility` プロパティを持ちます。

例えば、デフォルトでは拍子記号は最初の行の先頭で描画されますが、変更されない限り他の場所には描画されません。変更された場合、拍子記号は変更が行われた場所に描画されます。この変更が行の最後で行われた場合、新しい拍子記号は次の行の先頭に描画され、その前の行の最後にも忠告の拍子記号が描画されます。

この振る舞いは `break-visibility` プロパティによって制御されます。このプロパティについての説明は オブジェクトの可視性と色 を参照してください。このプロパティは 3 つのブール値からなるベクトルをとり、順に、そのオブジェクトが行の最後で描画されるかどうか、行の途中で描画されるかどうか、そして、行の先頭で描画されるかどうかを決定します。より正確には、改行の前、改行がない場合、改行の後です。

`break-visibility` プロパティによって制御する代わりに、これら 8 通りの組み合わせを ‘`scm/output-lib.scm`’ で定義されている定義済み関数によって指定することもできます。このファイルの中で、最後の 3 列がその列のヘッダで示される場所での可視性を表しています:

関数形式 | ベクトル形式 | 改行前 | 改行なし | 改行後
--- | --- | --- | --- | ---
`all-visible` | `#(#t #t #t)` | yes | yes | yes
`begin-of-line-visible` | `#(#f #f #t)` | no | no | yes
`center-visible` | `#(#f #t #f)` | no | yes | no
`end-of-line-visible` | `#(#t #f #f)` | yes | no | no
`begin-of-line-invisible` | `#(#t #t #f)` | yes | yes | no
`center-invisible` | `#(#t #f #t)` | yes | no | yes
`end-of-line-invisible` | `#(#f #t #t)` | no | yes | yes
`all-invisible` | `#(#f #f #f)` | no | no | no

`break-visibility` のデフォルト設定はレイアウト オブジェクトによって異なります。以下の表は、`break-visibility` によって影響をうけるすべてのレイアウト オブジェクトと、そのプロパティのデフォルト設定を示しています:

レイアウト オブジェクト | 通常のコンテキスト | デフォルト設定
--- | --- | ---
`BarLine` | `Score` | calculated
`BarNumber` | `Score` | `begin-of-line-visible`
`BreathingSign` | `Voice` | `begin-of-line-invisible`
`Clef` | `Staff` | `begin-of-line-visible`
`Custos` | `Staff` | `end-of-line-visible`
`DoublePercentRepeat` | `Voice` | `begin-of-line-invisible`
`KeyCancellation` | `Staff` | `begin-of-line-invisible`
`KeySignature` | `Staff` | `begin-of-line-visible`
`ClefModifier` | `Staff` | `begin-of-line-visible`
`RehearsalMark` | `Score` | `end-of-line-invisible`
`TimeSignature` | `Staff` | `all-visible`

以下の例は、小節線の可視性を制御するベクトルの使用方法を示しています:

>     \relative {
>       f'4 g a b
>       f4 g a b
>       % カレント行の最後で小節線を削除します
>       \once \override Score.BarLine.break-visibility = ##(#f #t #t)
>       \break
>       f4 g a b
>       f4 g a b
>     }

`break-visibility` をオーバライドするために使用されるベクトルの要素 3 つをすべて記述する必要がありますが、それらすべてが各レイアウト オブジェクトに対して効果を持つわけではなく、組み合わせによってはエラーになる場合もあります。以下の制限があります:

- 小節線を行の先頭に描画することはできません。
- 小節番号が `1` から始まるのでなければ、最初の行の先頭に描画することはできません。
- 音部記号 – 次のセクションを参照してください
- 2 重線のパーセント繰り返しはすべて描画するか、すべて描画しないかのどちらかです。描画するには `begin-of-line-invisible` を用い、描画しないのなら `all-invisible` を用います。
- Key signature – 次のセクションを参照してください
- ClefModifier – 次のセクションを参照してください

#### 特別な考慮を必要とするもの

#### 明示的な変更の後の可視性

`break-visibility` プロパティが調号の可視性と音部記号の変更を制御するのは、行の先頭 – つまり、改行の後 – においてだけです。行の途中や終わりでの明示的な調の変更や音部記号の変更の後に出現する調号や音部記号の可視性には効果を持ちません。以下の例では、`all-invisible` がセットされていますが、B フラット メジャーへの明示的な変更の後に出現する調号は可視のままです。

>     \relative {
>       \key g \major
>       f'4 g a b
>       % すべての調号を削除しようと試みます
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b
>       \break
>       f4 g a b
>       f4 g a b
>     }

そのような明示的な調号や音部記号の変更の可視性は `explicitKeySignatureVisibility` プロパティや `explicitClefVisibility` プロパティによって制御されます。これらは `break-visibility` プロパティと等価であり、どちらも `break-visibility` と同様に 3 つのブール値からなるベクトルか上でリストアップした定義済み関数をとります。どちらも `Staff` コンテキストのプロパティであり、レイアウト オブジェクト自体のプロパティではありません。ですから、これらは `\set` コマンドでセットします。どちらもデフォルトでは `all-visible` がセットされています。これらのプロパティは明示的な変更の結果として生じる調号と音部記号の可視性だけを制御し、行の先頭での調号や音部記号には効果を持ちませんので、オブジェクトを削除するには適切な `break-visibility` をオーバライドする必要があります。

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

#### 前の調をキャンセルする臨時記号の可視性

明示的な調の変更で描画される前の調をキャンセルする臨時記号を削除するには、`Staff` コンテキスト プロパティ `printKeyCancellation` に `#f` をセットします:

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \set Staff.printKeyCancellation = ##f
>       \override Staff.KeySignature.break-visibility = #all-invisible
>       \key bes \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

このオーバライドによって、調の変更を示す臨時記号だけが残ります。

調を C メジャーや A マイナーに変更する時、前の調をキャンセルする臨時記号は前の調のキャンセルしている だけ であることに注意してください。そのようなケースでは、`printKeyCancellation` を `#f` に設定しても効果はありません:

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \set Staff.printKeyCancellation = ##f
>       \key c \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

調を C メジャーや A マイナーに変更する場合に、前の調をキャンセルする臨時記号を消すには、`KeyCancellation` グラフィカル オブジェクトの可視性をオーバライドします:

>     \relative {
>       \key g \major
>       f'4 g a b
>       \set Staff.explicitKeySignatureVisibility = #all-invisible
>       \override Staff.KeyCancellation.break-visibility = #all-invisible
>       \key c \major
>       f4 g a b \break
>       f4 g a b
>       f4 g a b
>     }

#### 自動小節線

特殊なケースとして、`Score` コンテキストの `automaticBars` プロパティを設定することにより、小節線の描画を Off にすることもできます。`#f` をセットされた場合、小節線は自動的には描画されなくなり、`\bar` コマンドで明示的に作成しなければならなくなります。定義済みコマンド `\cadenzaOn` とは異なり、小節数はカウントされ続けます。後になってこのプロパティに `#t` がセットされると、このカウントに従って小節線の生成が再開されます。`#f` がセットされている場合、改行が起こりえるのは明示的な `\bar` コマンドがある場所でだけになります。

#### オクターブ移調付きの音部記号

オクターブ移調付きの音部記号上の小さな移調記号は `ClefModifier` レイアウト オブジェクトによって作り出されます。このオブジェクトの可視性は `Clef` オブジェクトの可視性とは独立して制御されます。そのため、各行の先頭においてそのような音部記号を完全に消そうとするなら、`Clef` オブジェクトと `ClefModifier` オブジェクトの両方に対して必要な `break-visibility` のオーバライドを行う必要があります。

明示的な音部記号の変更では、`explicitClefVisibility` プロパティが音部記号とそれに関連する移調記号の両方を制御します。

#### 参照

学習マニュアル: オブジェクトの可視性と色

#### LilyPond — 記譜法リファレンス v2.24.4 (安定版).

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