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

### 4.3.1 オブジェクトの可視性と色

教育目的の楽譜では、ある要素を省略した楽譜を譜刻して、学生にそれを付け足させるという訓練にしたいと思うかもしれません。簡単な例として、その訓練とは小節線の無い楽譜だと仮定してみましょう。しかしながら、通常、小節線は自動的に挿入されます。どうやって小節線が譜刻されることを防ぐのでしょうか？

このことに挑戦する前に、オブジェクト プロパティは インタフェイス と呼ばれるものにグループ化されているということを思い出してください – インタフェイスの中で見つかるプロパティ を参照してください。これはあるグラフィカル オブジェクトを調整するために一緒に使用されるかもしれないプロパティをグループ化したものです – あるオブジェクトに対してインタフェイス内のプロパティの 1 つを使うことが許可されるのなら、他のプロパティも許可されます。あるオブジェクトはいくつかのインタフェイス内にあるプロパティを使用し、別のオブジェクトはそれとは別のインタフェイス内にあるプロパティを使用します。ある特定のグラフィカルオブジェクトによって使用されるプロパティを保持しているインタフェイスは、そのグラフィカル オブジェクトについて記述している内部リファレンス ページの最後にリスト アップされていて、それらのプロパティはそれらのインタフェイスを参照することによって閲覧できます。

グラフィカル オブジェクトについての情報を見つけ出す方法を レイアウト オブジェクトのプロパティ で説明しました。同じアプローチを使って、内部リファレンスで小節線を譜刻するレイアウト オブジェクトを見つけ出します。Backend を経由して All layout objects に行くと、そこに `BarLine` と呼ばれるレイアウト オブジェクトがあることがわかります。そのレイアウト オブジェクトのプロパティには小節線の可視性をコントロールする 2 つのプロパティが含まれています: `break-visibility` と `stencil` です。さらに、`BarLine` はインタフェイスのいくつかをサポートしています。`grob-interface` もサポートされていて、そこには `transparent` プロパティと `color` プロパティが含まれています。これらすべてが小節線の可視性に影響を与えます (そしてもちろん、拡大解釈すれば他の多くのレイアウト オブジェクトにも影響を与えます)。次はこれらのプロパティをそれぞれ見ていきましょう。

#### `stencil` プロパティ

このプロパティは譜刻すべきシンボル (図柄) を指定することによって小節線の見た目を制御します。他の多くのプロパティでも共通に言えますが、このプロパティの値に `#f` をセットすることによって何も譜刻させなくすることができます。ではやってみましょう。以前と同様に、暗黙のコンテキスト `Voice` は省略します:

>     \relative {
>       \time 12/16
>       \override BarLine.stencil = ##f
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

小節線はまだ譜刻されています。何が間違っているのでしょうか？内部リファレンスに戻って、`BarLine` のプロパティを記述しているページを読み返してください。そのページの先頭に “BarLine オブジェクトは Bar_engraver によって作成されます” と記述されています。`Bar_engraver` ページに行ってください。そのページの最後で、`Bar_engraver` を保持するコンテキストがリスト アップされています。それらのコンテキストのタイプはすべて `Staff` です。ですから、`\override` コマンドが予期したように機能しなかったのは、`BarLine` はデフォルトの `Voice` コンテキストの中にはいなかったからなのです。コンテキストが間違って指定された場合、そのコマンドは機能しません。エラー メッセージは生成されず、ログ ファイルには何もログが残りません。正しいコンテキストを付け加えることによってコマンドを修正してみましょう:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.stencil = ##f
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

今度は小節線が消えました。`stencil` プロパティに `#f` をセットする操作は頻繁に行うので、短くしたコマンド `\omit` が用意されています:

>     \relative {
>       \time 12/16
>       \omit Staff.BarLine
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

しかしながら、`stencil` プロパティを `#f` にセットするのではなく、オブジェクトの大きさを修正する必要があるオブジェクトも存在するということに注意してください。そのようなオブジェクトの `stencil` プロパティを `#f` にセットするとエラーになります。 例えば、`NoteHead` オブジェクトの `stencil` プロパティを `#f` にセットするとエラーになります。この場合、`point-stencil` を使ってサイズが 0 のステンシル (型、型紙) をオブジェクトにセットします:

>     \relative {
>       c''4 c
>       \once \override NoteHead.stencil = #point-stencil
>       c4 c
>     }

#### `break-visibility` property

内部リファレンスの `BarLine` のプロパティから `break-visibility` プロパティには 3 つのブール値からなるベクトルが必要であることがわかります。これらはそれぞれ、小節線が行の最後、行の途中、行の最初に譜刻されるかどうかを制御します。以下の例ではすべての小節線を消したいので、必要となる値は `#(#f #f #f)` です (同じ結果を `all-invisible` でも得ることができます)。それではやってみましょう。`Staff` コンテキストを含めることを忘れないでください。また、この値を書くときに括弧を始める前に `##` を付ける必要があることにも注意してください。`#` の 1 つはベクトルを導入するときに値の一部として必要とされ、先頭の `#` は `\override` コマンドの中で常に値の前に置くことが必要とされます。

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.break-visibility = ##(#f #f #f)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

今度もすべての小節線が消えました。

#### `transparent` プロパティ

内部リファレンスの `grob-interface` ページにあるプロパティから `transparent` プロパティはブール値であることがわかります。これはグラフィカル オブジェクトを透明にする場合には `#t` にセットします。次の例では、小節線ではなく拍子記号を不可視にしてみましょう。そうするには、まず、拍子記号のグラフィカル オブジェクト名を見つける必要があります。`TimeSignature` レイアウト オブジェクトのプロパティを見つけるために内部リファレンスの ‘すべてのレイアウト オブジェクト’ ページに戻ってください。`TimeSigunature` は `Time_signature_engraver` によって作り出され、さらに、`Time_signature_engraver` は `Staff` コンテキストに含まれ、さらに、`Staff` コンテキストは `grob-interface` をサポートしているということがわかります。そのため、拍子記号を透明にするためのコマンドは以下のようになります:

>     \relative {
>       \time 12/16
>       \override Staff.TimeSignature.transparent = ##t
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

`transparent` プロパティに `#t` をセットする操作も頻繁に行うので、短くしたコマンド `\hide` が用意されています:

>     \relative {
>       \time 12/16
>       \hide Staff.TimeSignature
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

どちらの場合でも拍子記号は消えました。しかしながら、このコマンドは拍子記号があるべき場所に隙間を残しています。たぶん、これは学生がその部分を埋めるための練習としては望ましいでしょうが、他の状況ではこの隙間は望ましくありません。この隙間を取り除くには、拍子記号の `transparent` の代わりにステンシル (型、型紙) を `#f` にセットします:

>     \relative {
>       \time 12/16
>       \omit Staff.TimeSignature
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

違いは明白です: ステンシルを `#f` にセットする (`\omit` を用いることもできます) と、オブジェクト自体が削除されます。一方、オブジェクトを `transparent` (透明) にする (`\hide` を用いることもできます)とそのオブジェクトは消えますが、オブジェクトは不可視になっただけです。

### 色 (color)

#### `color` プロパティ

最後に、小節線の色を白にすることによって小節線を不可視にしてみましょう。(これには白い小節線が譜線と交差したところで譜線を見えたり見えなくしてしまうかもしれないという問題があります。以下のいくつかの例で、このことを予測することはできないと思うかもしれません。そうなる理由と、それを制御する方法についての詳細は、 Painting objects white でカバーされています。しかしここでは色について学んでいるところなので、オブジェクトを白で描くことの限界を受け入れるだけにしてください。)

`grob-interface` はカラー プロパティの値はリストであると指定しています。しかしながら、そのリストが何であるべきなのかの説明はありません。カラー プロパティで必要とされるリストは実際のところ内部ユニットの中にある値のリストです。しかし、内部ユニットの中にある値を知らなくても済むように、カラーを指定するための手段がいくつか用意されています。最初の方法は List of colors にある最初の表でリスト アップされている ‘標準’ のカラーの 1 つを使用する方法です。小節線を白にするには以下のように記述します:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #white
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

今度も再び小節線は見えなくなりました。white の前にアポストロフィは付かないということに注意してください – これはシンボルではなく変数です。この変数は評価される時、小節線の色を白にセットするのに必要な内部的な値のリストを提供します。標準カラー リストにある他のカラーもまた変数です。小節線の色をこのリストの中にある他の変数に変更することで、これが機能することをあなた自身で納得できます。

カラーを変えるための 2 つ目の方法は、 List of colors の 2 番目のリストの中にある X11 カラー名のリストを使用する方法です。しかしながら、X11 カラー名は関数 `x11-color` によって実際の値にマッピングされます。`x11-color` は以下のように X11 カラー シンボルを内部値のリストに変換します:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #(x11-color 'white)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

この場合、関数 `x11-color` はシンボルを引数として扱うので、変数として評価されないようシンボルの前にアポストロフィを付ける必要があり、関数呼び出し全体を括弧で囲む必要があるということに注意してください。

もう 1 つ関数があります。RGB 値を内部カラーに変換する `rgb-color` 関数です。この関数は赤、緑、青の輝度を表す 3 つの引数をとります。これらの引数は 0 から 1 までの値をとります。ですから、カラーを赤にセットする場合の値は `(rgb-color 1 0 0)` となり、白の場合は `(rgb-color 1 1 1)` となります:

>     \relative {
>       \time 12/16
>       \override Staff.BarLine.color = #(rgb-color 1 1 1)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

最後に、X11 カラー セットの一部であるグレー スケールを用いる方法もあります。グレー スケールの範囲は黒 `'grey0` から白 `'grey100` まで 1 段階ずつあります。グレー スケールの使用方法を示すために、例の中にあるすべてのレイアウト オブジェクトのカラーをさまざまな濃度のグレーにセットしてみましょう:

>     \relative {
>       \time 12/16
>       \override Staff.StaffSymbol.color = #(x11-color 'grey30)
>       \override Staff.TimeSignature.color = #(x11-color 'grey60)
>       \override Staff.Clef.color = #(x11-color 'grey60)
>       \override Voice.NoteHead.color = #(x11-color 'grey85)
>       \override Voice.Stem.color = #(x11-color 'grey85)
>       \override Staff.BarLine.color = #(x11-color 'grey10)
>       c''4 b8 c d16 c d8 |
>       g,8 a16 b8 c d4 e16 |
>       e8
>     }

各レイアウト オブジェクトに関連付けされているコンテキストに注意してください。これらのコンテキストを正しく取得することが重要であり、そうしなければコマンドは機能しません！コンテキストの中には特定のエングラーバが置かれているということを忘れないでください。エングラーバに対するデフォルト コンテキストを見つけ出すには、内部リファレンスのレイアウト オブジェクトからスタートして、そこからそれを作り出すエングラーバのページに行きます。エングラーバのページには、通常はどのコンテキストにそのエングラーバが含まれているのかが記述されています。

#### LilyPond — 学習マニュアル v2.22.2 (安定版).