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

[image of music]

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

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

[image of music]


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

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

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

[image of music]

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

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

[image of music]


オブジェクトを白で描く

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

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

[image of music]

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

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

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

[image of music]


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)yesyesyes
begin-of-line-visible#(#f #f #t)nonoyes
center-visible#(#f #t #f)noyesno
end-of-line-visible#(#t #f #f)yesnono
begin-of-line-invisible#(#t #t #f)yesyesno
center-invisible#(#t #f #t)yesnoyes
end-of-line-invisible#(#f #t #t)noyesyes
all-invisible#(#f #f #f)nonono

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

レイアウト オブジェクト通常のコンテキストデフォルト設定
BarLineScorecalculated
BarNumberScorebegin-of-line-visible
BreathingSignVoicebegin-of-line-invisible
ClefStaffbegin-of-line-visible
CustosStaffend-of-line-visible
DoublePercentRepeatVoicebegin-of-line-invisible
KeyCancellationStaffbegin-of-line-invisible
KeySignatureStaffbegin-of-line-visible
ClefModifierStaffbegin-of-line-visible
RehearsalMarkScoreend-of-line-invisible
TimeSignatureStaffall-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
}

[image of music]

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


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

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

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
}

[image of music]

そのような明示的な調号や音部記号の変更の可視性は 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
}

[image of music]

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

明示的な調の変更で描画される前の調をキャンセルする臨時記号を削除するには、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
}

[image of music]

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

調を 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
}

[image of music]

調を 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
}

[image of music]

自動小節線

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

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

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

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

参照

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


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