GNU LilyPond 学習マニュアル: 4.4.3 譜外部オブジェクト

### 4.4.3 譜外部オブジェクト

譜外部オブジェクトは自動的に衝突を回避するよう配置されます。小さな値の `outside-staff-priority` プロパティを持つオブジェクトは譜の近くに配置され、他の譜外部オブジェクトは衝突を避けるのに必要な分だけ離されます。`outside-staff-priority` は `grob-interface` の中で定義されているため、すべてのレイアウト オブジェクトのプロパティです。デフォルトでは、すべての譜内部オブジェクトの `outside-staff-priority` は `#f` にセットされていて、譜外部オブジェクトが作成されたときにその譜外部オブジェクトの `outside-staff-priority` に適当な数値がセットされます。以下の表はデフォルトで `Staff` コンテキストまたは `Voice` コンテキストの中に配置されるいくつかの一般的な譜外部オブジェクトのデフォルトの `outside-staff-priority` 値を示しています。

レイアウト オブジェクト | 優先度 | 以下のオブジェクトの配置を制御する:
--- | --- | ---
`MultiMeasureRestText` | `450` | 全休符上のテキスト
`TextScript` | `450` | マークアップ テキスト
`OttavaBracket` | `400` | オッターバ (オクターブを上下させる記号) の囲み
`TextSpanner` | `350` | テキスト スパナ
`DynamicLineSpanner` | `250` | すべての強弱記号
`VoltaBracketSpanner` | `100` | Volta (番号付きのリピート) の囲み
`TrillSpanner` | `50` | トリル記号

これらのうちのいくつかのデフォルトでの配置を示している例を挙げます。

>     % 以降のテキスト スパナの詳細を設定します
>     \override TextSpanner #'(bound-details left text)
>         = \markup { \small \bold Slower }
>     % 強弱記号を譜の上に配置します
>     \dynamicUp
>     % オッターバ囲みの開始
>     \ottava #1
>     c'4 \startTextSpan
>     % 強弱テキストとヘアピンを付け加えます
>     c4\pp\<
>     c4
>     % テキスト スクリプトを付け加えます
>     c4^Text |
>     c4 c
>     % 強弱テキストを付け加え、強弱ヘアピンを終わらせます
>     c4\ff c \stopTextSpan |
>     % オッターバ囲みを終わらせます
>     \ottava #0
>     c,4 c c c |

この例はテキスト スパナ – 音楽の上に置かれる延長線付きのテキスト – の作成方法についても示しています。スパナは `\startTextSpan` コマンドから `\stopTextSpan` コマンドまで延び、テキストのフォーマットは `\override TextSpanner` コマンドによって定義されます。詳細は テキスト スパナ を参照してください。

この例はさらにオッターバ囲みを作成する方法についても示しています。

小節番号、メトロノーム記号、リハーサル記号は示されていないということに注意してください。デフォルトでは、それらは `Score` コンテキストの中で作成され、それらの `outside-staff-priority` は `Staff` コンテキストの中で作成されるレイアウト オブジェクトとは異なり無視されます。小節番号、メトロノーム記号あるいはリハーサル記号をそれらの `outside-staff-priority` に従って配置したいのなら、`Score` コンテキストからそれぞれ `Bar_number_engraver`, `Metronome_mark_engraver`, `Mark_engraver` を削除して最上位の `Staff` コンテキストに置く必要があります。そうした場合、それらの記号には以下のデフォルトの `outside-staff-priority` 値が与えられます:

レイアウト オブジェクト | 優先度
--- | ---
`RehearsalMark` | `1500`
`MetronomeMark` | `1000`
`BarNumber` | `100`

`outside-staff-priority` のデフォルト値による配置があなたの望みに合わない場合、いずれかのオブジェクトの優先度をオーバライドすることになるかもしれません。上記の例で、オッターバ囲みをテキスト スパナの下に配置したいとします。すべきことは、`OttavaBracket` は `Staff` コンテキストの中に作成されるということを思い出し、`OttavaBracket` の優先度を内部リファレンスか上記の表で調べて、それを `TextSpanner` の値よりも小さくすることです:

>     % 以降のテキスト スパナの詳細を設定します
>     \override TextSpanner #'(bound-details left text)
>         = \markup { \small \bold Slower }
>     % 強弱記号を譜の上に配置します
>     \dynamicUp
>     % 以降のオッターバ囲みをテキスト スパナの下に配置します
>     \once \override Staff.OttavaBracket #'outside-staff-priority = #340
>     % オッターバ囲みの開始
>     \ottava #1
>     c'4 \startTextSpan
>     % 強弱テキストを付け加えます
>     c4\pp
>     % 強弱の線スパナを付け加えます
>     c4\<
>     % テキスト スクリプトを付け加えます
>     c4^Text |
>     c4 c
>     % 強弱テキストを付け加えます
>     c4\ff c \stopTextSpan |
>     % オッターバ囲みを終わらせます
>     \ottava #0
>     c,4 c c c |

スラーはデフォルトでは譜内部オブジェクトに分類されています。しかしながら、譜の上部に配置された音符に付くスラーはしばしば譜の上に表示されます。このことは、スラーがまず最初に配置されるため、アーティキュレーションなどの譜外部オブジェクトをあまりにも高い位置に押し上げる可能性があります。アーティキュレーションの `avoid-slur` プロパティに `'inside` をセットすることでアーティキュレーションをスラーよりも内側に配置することができます。しかし、`avoid-slur` プロパティはアーティキュレーションの `outside-staff-priority` が `#f` にセットされている場合にのみ効果を持ちます。代替手段として、スラーの `outside-staff-priority` に数値をセットすることによって、スラーを他の譜外部オブジェクトとともに `outside-staff-priority` 値に従って配置することができます。ここで、2 つの方法の効果を示す例を挙げます:

>     c4( c^\markup { \tiny \sharp } d4.) c8 |
>     c4(
>     \once \override TextScript #'avoid-slur = #'inside
>     \once \override TextScript #'outside-staff-priority = ##f
>     c4^\markup { \tiny \sharp } d4.) c8 |
>     \once \override Slur #'outside-staff-priority = #500
>     c4( c^\markup { \tiny \sharp } d4.) c8 |

`outside-staff-priority` は、個々のオブジェクトの垂直方向の配置を制御するために使用することもできます。しかしながら、その結果は常に望み通りになるわけではありません。自動配置 にある例で “Text3” を “Text4” の上に配置したいとします。すべきことは `TextScript` の優先度を内部リファレンスか上記の表で調べて、“Text3” の優先度を大きくすることです:

>     c2^"Text1"
>     c2^"Text2" |
>     \once \override TextScript #'outside-staff-priority = #500
>     c2^"Text3"
>     c2^"Text4" |

これはたしかに “Text3” を “Text4” の上に配置しています。しかし、“Text3”を “Text2” の上に配置して、“Text4” を押し下げてもいます。おそらく、これはそれほど望ましい結果ではないでしょう。本当に望んでいることは、すべての注釈を譜の上に譜から同じ距離だけ離して配置することです。そうするには明らかに、テキストのためにもっと広いスペースを確保するために、音符を水平方向に広げる必要があります。これは `\textLengthOn` コマンドを用いることで達成できます。

### \textLengthOn

デフォルトでは、音楽のレイアウトが考慮されている限り、マークアップによって作り出されるテキストは水平方向のスペースと関係しません。`\textLengthOn` コマンドはこの動作を逆にして、テキストの配置に便宜をはかる必要がある限り、音符の間隔を広げます:

>     \textLengthOn  % 音符の間隔を広げてテキストに揃えます
>     c2^"Text1"
>     c2^"Text2" |
>     c2^"Text3"
>     c2^"Text4" |

デフォルトの動作に戻すためのコマンドは `\textLengthOff` です。`\once` は `\override`, `\set`, `\revert` それに `\unset` だけに付けることができるということを思い出してください。そのため、`\textLengthOn` で `\once` を使うことはできません。

マークアップ テキストは譜の上に突き出している音符を避けます。このことが望ましくない場合、優先度を `#f` にセットすることによって上方向への自動再配置を Off にすることになるかもしれません。ここで、マークアップ テキストがそのような音符とどのように相互作用するかを示す例を挙げます。

>     % このマークアップは短いため衝突は起きません
>     c2^"Tex" c'' |
>     R1 |

>     % このマークアップは長くて納まりきらないため、上に押し上げられます
>     c,,2^"Text" c'' |
>     R1 |

>     % 衝突回避を OFF にします
>     \once \override TextScript #'outside-staff-priority = ##f
>     c,,2^"Long Text   " c'' |
>     R1 |

>     % 衝突回避を OFF にします
>     \once \override TextScript #'outside-staff-priority = ##f
>     \textLengthOn        % そして textLengthOn を ON にします
>     c,,2^"Long Text   "  % 後ろにスペースが付け加えられます
>     c''2 |

### 強弱記号

通常、強弱記号は譜の下に配置されます。しかしながら、`dynamicUp` コマンドを使うことで上に配置されるかもしれません。強弱記号は、その記号が付いている音符と垂直方向の関係で配置され、フレージング スラーや小節番号などの譜内部オブジェクトのすべてよりも下 (あるいは上) に配置されます。このことは、以下の例のように、到底受け入れられない結果を生み出す可能性があります:

>     \clef "bass"
>     \key aes \major
>     \time 9/8
>     \dynamicUp
>     bes4.~\f\< \( bes4 bes8 des4\ff\> c16 bes\! |
>     ees,2.~\)\mf ees4 r8 |

しかしながら、音符とそれに付けられた強弱記号が互いに近い場合、自動配置は後の方にある強弱記号を譜から離すことによって衝突を避けます。しかし、以下のかなり不自然な例が示すように、それは最適な配置ではないかもしれません:

>     \dynamicUp
>     a4\f b\mf c\mp b\p

‘実際’ の音楽で同じような状況があった場合、音符の間隔をもう少し広げて、すべての強弱記号が譜から垂直方向に同じだけ離れるようにする方が望ましいかもしれません。マークアップ テキストの場合は `\textLengthOn` コマンドを用いることによってそうすることができますが、強弱記号には等価のコマンドがありません。そのため、`\override` コマンドを用いてそれを達成する方法を見出す必要があります。

### グラフィカル オブジェクトのサイズ

まず最初に、グラフィカル オブジェクトのサイズがどのように決定されるかを学ばなくてはなりません。すべてのグラフィカル オブジェクトの内部では参照ポイントが定義され、それはそれらの親オブジェクトとの相対位置を決定するために使用されます。このポイントは親オブジェクトから垂直方向に `X-offset`、垂直方向に `Y-offset` 離れた位置になります。オブジェクトの水平方向の広がりは数値のペア `X-extent` で与えられ、そのペアはオブジェクトの左端と右端の参照ポイントとの相対関係について述べています。垂直方向の広がりも同様に数値のペア `Y-extent` によって与えられます。これらは `grob-interface` をサポートするすべてのグラフィカル オブジェクトが持つプロパティです。

デフォルトでは、譜外部オブジェクトには 0 の幅が与えられているため、水平方向で重なる可能性があります。これは `extra-spacing-width` に `'(+inf.0 . -inf.0)` をセットすることによって、左端の広がりにプラス無限大、右端の広がりにマイナス無限大を付け加えるというトリックによって達成されています。そのため、譜外部オブジェクトが水平方向で重ならないことを保証するには、`extra-spacing-width` の値を `'(0 . 0)` にオーバライドする必要があります。これにより、本当の幅が明らかになります。以下は強弱記号テキストに対してこれを行うコマンドです:

>     \override DynamicText #'extra-spacing-width = #'(0 . 0)

これが前の例で機能するかどうかを見てみましょう:

>     \dynamicUp
>     \override DynamicText #'extra-spacing-width = #'(0 . 0)
>     a4\f b\mf c\mp b\p |

確かに強弱記号の再配置をストップさせています。しかし、2 つの問題が残っています。強弱記号を互いにもう少し離すべきであり、それらは譜から同じ距離にあるほうが望ましいです。最初の問題は簡単に解決できます。`extra-spacing-width` を 0 にする代わりに、もう少し大きな値を与えるのです。単位は 2 本の譜線の間隔なので、左端を 1 単位の半分だけ左に移動させ、右端を 1 単位の半分だけ右に移動させると解決になります:

>     \dynamicUp
>     % Extend width by 1 staff space
>     \override DynamicText #'extra-spacing-width = #'(-0.5 . 0.5)
>     a4\f b\mf c\mp b\p

これで前よりも良くなりました。しかし、強弱記号が音符に合わせて上下するよりも、同じベースラインで揃っている方が望ましいでしょう。それを行うためのプロパティは `staff-padding` であり、後に続くセクションでカバーされています。

他の言語: English, česky, deutsch, español, italiano, nederlands

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