[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5 高度な調整

@translationof Advanced tweaks

このセクションでは、楽譜の見た目を細かく調節するためのさまざまなアプローチについて議論します。

参照

学習マニュアル: (learning)出力を調整する section ‘出力を調整する’ in Learning Manual, (learning)その他の情報源 section ‘その他の情報源’ in Learning Manual

記譜法リファレンス: 内部リファレンスの説明, プロパティを変更する

拡張: (extending)Interfaces for programmers section ‘Interfaces for programmers’ in Extending

インストールされているファイル: ‘scm/define-grobs.scm’

コード断片集: (snippets)Tweaks and overrides section ‘Tweaks and overrides’ in Snippets

内部リファレンス: (internals)All layout objects section ‘All layout objects’ in Internals Reference


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.1 オブジェクトを揃える

@translationof Aligning objects

self-alignment-interface と/あるいは side-position-interface をサポートするグラフィカル オブジェクトは、さまざまな形式で配置済みのオブジェクトに揃えることができます。そのようなオブジェクトのリストは、 (internals)self-alignment-interface section ‘self-alignment-interface’ in Internals Reference と (internals)side-position-interface section ‘side-position-interface’ in Internals Reference を参照してください。

すべてのグラフィカル オブジェクトは参照ポイント、水平方向の広がり、それに垂直方向の広がりを持ちます。水平方向の広がりは、参照ポイントから左端と右端までの距離を意味する数値のペアであり、左端は負値です。垂直方向の広がりは、参照ポイントから下端と上端までの距離を意味する数値のペアであり、下端は負値です。

あるオブジェクトの譜面上の位置は、X-offset プロパティと Y-offset プロパティの値によって与えられます。X-offset の値は、親オブジェクトの参照ポイントの X 座標からの距離を意味します。Y-offset の値は、譜の中央線からの距離を意味します。X-offset と Y-offset の値は直接設定されることもありますし、いくつかの形式で親オブジェクトと揃えるためにプロシージャによって算出されることもあります。

Note: 多くのオブジェクトは特殊な配置規則を持っています。そのため、そのオブジェクトが self-alignment-interface をサポートしていたとしても、X-offset あるいは Y-offset の設定は無視されたり、変更されることがあります。

例えば、臨時記号は Y-offset を設定することにより垂直方向の位置を変更することができますが、X-offset は効果を持ちません。

リハーサル記号は、小節線、音部記号、拍子記号それに調号などの改行可能なオブジェクトに揃えることができます。リハーサル記号をそのようなオブジェクトに合わせて配置するために、break-aligned-interface の中に特別なプロパティがあります。

参照

記譜法リファレンス: break-alignable-interface を使用する,

拡張: (extending)Callback functions section ‘Callback functions’ in Extending


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

X-offset と Y-offset を直接設定する

@translationof Setting X-offset and Y-offset directly

多くのオブジェクトの X-offset プロパティと Y-offset プロパティに数値を与えることができます。以下の例は、3 つの音符を示していて、1 つはデフォルト配置の運指記号を持ち、他の 2 つの運指記号は X-offset と Y-offset が変更されています。

 
a'-3
a'
-\tweak X-offset #0
-\tweak Y-offset #0
-3
a'
-\tweak X-offset #-1
-\tweak Y-offset #1
-3

[image of music]


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

side-position-interface を使用する

@translationof Using the side-position-interface

side-position-interface をサポートするオブジェクトは、その親オブジェクトの隣に配置することができ、それにより、それら 2 つのオブジェクトの指定された端をくっつけることができます。オブジェクトを親オブジェクトの上、下、右、あるいは左に配置することができます。親オブジェクトを指定することはできません: 親オブジェクトは入力ストリームの中での要素の順序によって決定されます。たいていのオブジェクトの親オブジェクトは、そのオブジェクトに関連する符頭となります。

side-axis プロパティと direction プロパティの値は、以下のように、オブジェクトが配置される場所を決定します:

side-axisdirection
propertypropertyPlacement
0-1左
01右
1-1下
11上

side-axis が 0 である場合、X-offset にはプロシージャ ly:side-position-interface::x-aligned-side をセットする必要があります。このプロシージャは、direction の値に基づいて親オブジェクトの左あるいは右にオブジェクトを配置するための適切な値を X-offset に返します。

side-axis が 1 である場合、Y-offset にはプロシージャ ly:side-position-interface::y-aligned-side をセットする必要があります。このプロシージャは、direction の値に基づいて親オブジェクトの上あるいは下にオブジェクトを配置するための適切な値を Y-offset に返します。


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

self-alignment-interface を使用する

@translationof Using the self-alignment-interface

オブジェクトを自動的に水平方向に揃える

self-alignment-interface をサポートするオブジェクトの水平方向の揃えは、self-alignment-X プロパティの値によって制御され、そのオブジェクトの X-offset プロパティにはly:self-alignment-interface::x-aligned-on-self がセットされています。 self-alignment-X には任意の実数値を与えることができますが、 与える値は、そのオブジェクトの X 方向の広がりの半分を単位とします。負値はオブジェクトを右に移動させ、正値はオブジェクトを左に移動させます。値が 0 であればそのオブジェクトは親オブジェクトの参照ポイントに中央揃えされ、値が -1 であればそのオブジェクトの左端が親オブジェクトの参照ポイントに揃えられ、値が 1 であればそのオブジェクトの右端が親オブジェクトの参照ポイントに揃えられます。記号 LEFT, CENTER, それに RIGHT はそれぞれ -1, 0, それに 1 に対応します。

通常、\override コマンドを用いて self-alignment-X の値を変更しますが、\tweak コマンドを用いることで単一の音符に付けられている複数の注釈を個別に揃えることができます:

 
a'
-\tweak self-alignment-X #-1
^"left-aligned"
-\tweak self-alignment-X #0
^"center-aligned"
-\tweak self-alignment-X #RIGHT
^"right-aligned"
-\tweak self-alignment-X #-2.5
^"aligned further to the right"

[image of music]

オブジェクトを自動的に垂直方向に揃える

オブジェクトの Y-offset プロパティに ly:self-alignment-interface::y-aligned-on-self がセットされていれば、水平方向の揃えと同じように、垂直方向に揃えることができます。しかしながら、垂直方向の揃えには他のメカニズムも関与します: Y-offset の値は、垂直方向の揃えに関与する変数の 1 つに過ぎません。このことにより、いくつかのオブジェクトの Y-offset 値の調整はややこしくなります。単位はそのオブジェクトの垂直方向の広がりの半分です。通常これは非常に小さいため、非常に大きな数値が必要になる可能性があります。値が -1 であればそのオブジェクトの下端が親オブジェクトの参照ポイントに揃えられ、値が 0 であればそのオブジェクトの中央が親オブジェクトの参照ポイントに揃えられ、値が 1 であればそのオブジェクトの上端が親オブジェクトの参照ポイントに揃えられます。記号 DOWN, CENTER, それに UP はそれぞれ -1, 0, それに 1 に対応します。

オブジェクトを自動的に両方向に揃える

X-offset と Y-offset の両方の設定を行うことで、オブジェクトの水平方向と垂直方向の揃えを同時に行うことができます。

以下の例は、運指記号を符頭に近づけるための調整方法を示しています。

 
a'
-\tweak self-alignment-X #0.5  % 左方向に移動させます
-\tweak Y-offset #ly:self-alignment-interface::y-aligned-on-self
-\tweak self-alignment-Y #-1  % 上方向に移動させます
-3  % 3 の指

[image of music]


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

break-alignable-interface を使用する

@translationof Using the break-alignable-interface

リハーサル記号と小節番号を小節線ではなく、記譜オブジェクトに揃えることができます。対象となる記譜オブジェクトには、ambitus, breathing-sign, clef, custos, staff-bar, left-edge, key-cancellation, key-signature, それに time-signature があります。

それぞれの記号は、リハーサル記号が揃えられるデフォルトの参照点を持ち、その位置は種類ごとに異なります。

 
% リハーサル記号は音部記号の右端に揃えられます
\override Score.RehearsalMark.break-align-symbols = #'(clef)
\key a \major
\clef treble
\mark "↓"
e'1
% リハーサル記号は拍子記号の左端に揃えられます
\override Score.RehearsalMark.break-align-symbols = #'(time-signature)
\key a \major
\clef treble
\time 3/4
\mark "↓"
e'2.
% リハーサル記号はブレス記号の中央に揃えられます
\override Score.RehearsalMark.break-align-symbols = #'(breathing-sign)
\key a \major
\clef treble
\time 4/4
e'1
\breathe
\mark "↓"

[image of music]

揃えの対象となり得るオブジェクトのリストを指定することができます。揃えを行う時点で対象リストの中にあるオブジェクトのいくつかが不可視である – break-visibility の設定や、調号と音部に対する明示的な可視性の設定により – 場合、リハーサル記号あるいは小節番号はリストの中にある最初の可視のオブジェクトに揃えられます。リストの中にあるオブジェクトがすべて不可視である場合、小節線に揃えられます。小節線が不可視である場合、小節線があるはずの場所に揃えられます。

 
% リハーサル記号は調号の右端に揃えられます
\override Score.RehearsalMark.break-align-symbols = #'(key-signature clef)
\key a \major
\clef treble
\mark "↓"
e'1
% リハーサル記号は音部記号の右端に揃えられます
\set Staff.explicitKeySignatureVisibility = #all-invisible
\override Score.RehearsalMark.break-align-symbols = #'(key-signature clef)
\key a \major
\clef bass
\mark "↓"
gis,1
% リハーサル記号は小節線の中央に揃えられます
\set Staff.explicitKeySignatureVisibility = #all-invisible
\set Staff.explicitClefVisibility = #all-invisible
\override Score.RehearsalMark.break-align-symbols = #'(key-signature clef)
\key a \major
\clef treble
\mark "↓"
e'1

[image of music]

以下の例で示すように、記譜オブジェクトに対するリハーサル記号の揃えを変更することができます。複数の譜を持つ楽譜では、この設定はすべての譜に適用されます。

 
% リハーサル記号は調号の右端に揃えられます
\override Score.RehearsalMark.break-align-symbols = #'(key-signature)
\key a \major
\clef treble
\time 4/4
\mark "↓"
e'1
% リハーサル記号は調号の中央に揃えられます
\once \override Score.KeySignature.break-align-anchor-alignment = #CENTER
\mark "↓"
\key a \major
e'1
% リハーサル記号は調号の左端に揃えられます
\once \override Score.KeySignature.break-align-anchor-alignment = #LEFT
\key a \major
\mark "↓"
e'1

[image of music]

また、リハーサル記号を左端に揃えて、さらに任意の量だけ右あるいは左にずらすことができます。単位は譜スペースです:

 
% リハーサル記号は調号の左端に揃えられて
% さらに 3.5 譜スペース右にずらされます
\override Score.RehearsalMark.break-align-symbols = #'(key-signature)
\once \override Score.KeySignature.break-align-anchor = #3.5
\key a \major
\mark "↓"
e'1
% リハーサル記号は調号の左端に揃えられて
% さらに 2 譜スペース左にずらされます
\once \override Score.KeySignature.break-align-anchor = #-2
\key a \major
\mark "↓"
e'1

[image of music]


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.2 グラフィカル オブジェクトを垂直方向にグループ化する

@translationof Vertical grouping of grobs

VerticalAlignment グラフィカル オブジェクトと VerticalAxisGroup グラフィカル オブジェクトは対で機能します。VerticalAxisGroup は Staff, Lyrics, 等のような異なるグラフィカル オブジェクトをグループにまとめます。それから、VerticalAlignment が VerticalAxisGroup によってグループ化されたグラフィカル オブジェクトを垂直方向に揃えます。通常、楽譜には VerticalAlignment は 1 つしかありませんが、Staff, Lyrics 等はそれ自体でそれぞれに VerticalAxisGroup を持ちます。


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.3 ステンシルを変更する

@translationof Modifying stencils

すべてのレイアウト オブジェクトは、grob-interface の一部である stencil プロパティを持ちます。通常、デフォルトでこのプロパティには、出力でそのオブジェクトを具現化する記号を描画するための特有の関数がセットされています。例えば、MultiMeasureRest オブジェクトの stencil プロパティに対する標準設定は、ly:multi-measure-rest::print です。

stencil プロパティを変更して異なる描画関数を参照させることにより、オブジェクトの標準記号を置き換えることができます。これには LilyPond 内部機能についての高い知識が求められます。しかしながら、多くの場合にまずまずの結果を生み出すもっと簡単な方法があります。

簡単な方法では、stencil プロパティにテキストを描画する関数 – ly:text-interface::print – をセットし、必要な記号を生み出すマークアップ テキストを保持するよう設定された text プロパティ与えます。マークアップの自由度の高さにより、多くのことを達成できます。詳細は、マークアップ内部でのグラフィック記譜法 を参照してください。

以下の例では、この方法を用いて符頭記号を内部に×を持つ円に変更しています。

 
XinO = {
  \once \override NoteHead.stencil = #ly:text-interface::print
  \once \override NoteHead.text = \markup {
    \combine
      \halign #-0.7 \draw-circle #0.85 #0.2 ##f
      \musicglyph "noteheads.s2cross"
  }
}
\relative {
  a' a \XinO a a
}

[image of music]

\musicglyph マークアップ コマンドで、Emmentaler フォントに含まれる任意の Feta グリフを使用することができます。@ref{The Emmentaler font} を参照してください。

‘EPS’ ファイルや Postscript コマンドを、それぞれ \epsfile や \postscript マークアップ コマンドを使って行内に埋め込むことができます。Graphic を参照してください。

参照

記譜法リファレンス: マークアップ内部でのグラフィック記譜法, テキストをフォーマットする, @ref{Text markup commands}, @ref{The Emmentaler font}, Graphic


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.4 形状を変更する

@translationof Modifying shapes


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

タイとスラーの形状を変更する

@translationof Modifying ties and slurs

Tie, Slur, PhrasingSlur, LaissezVibrerTie, それに RepeatTie はすべて 3 次のベジエ曲線として描かれます。自動的に算出されるタイやスラーの形状が最適ではない場合、以下の 2 つの方法を用いて手動で形状を変更することができます:

  1. 自動的に算出されるベジエ曲線の制御ポイントの移動させる
  2. 求める曲線を定義するのに必要な 4 つの制御ポイントの位置を明示的に指定する

2 つの方法について以下で説明します。曲線の調節がわずかであれば、最初の方法が適しています。2 番目の方法は単一の音符に関連付けられる曲線を作り出す場合に適しています。

3 次ベジエ曲線

3 次あるいは 3 乗のベジエ曲線は、4 つの制御ポイントによって定義されます。1 番目と 4 番目の制御ポイントは曲線の始点と終点になります。間にある 2 つの制御ポイントは曲線の形状を定義します。Web でベジエ曲線が描かれる様子を示すアニメーションを見つけることができるでしょう。しかしながら、以下の記述も役に立つかもしれません。ベジエ曲線は最初の制御ポイントから 2 番目の制御ポイントに進み、徐々に 3 番目の制御ポイントの方へ向きを変えながら 4 番目の制御ポイントの方へ向かい続け、3 番目の制御ポイントから 4 番目の制御ポイントに到達します。ベジエ曲線は 4 つの制御ポイントからなる四角形の中に納まります。制御ポイントの平行移動、回転、伸縮はすべて同じ操作です。

制御ポイントを移動させる

以下の例では、タイの自動配置が最適ではなく、\tieDown も役に立ちません。

 
<<
  { e'1~ 1 }
\\
  \relative { r4 <g' c,> <g c,> <g c,> }
>>

[image of music]

\shape でタイの制御ポイントを調節することで衝突を避けることができます。

\shape の構文は以下の通りです:

 
[-]\shape displacements item

これは item の制御ポイントを displacements だけ移動させます。引数 displacements は数のペアのリスト、あるいはそのようなリストのリストです。ペアの要素は制御ポイントの座標の移動量を表しています。item が文字列の場合、指定されたグラフィカル オブジェクト タイプに \once \override で適用されます。item が音楽表記の場合、その音楽表記に調節が適用されます。

言い換えると、\shape 関数は、引数 item が “Slur” のようなグラフィカル オブジェクト名であるか “(” のような音楽表記であるかによって、\once \override コマンドあるいは \tweak コマンドのどちらにでもなり得ます。引数 displacements は 4 つの (dx . dy) ペアのリストで 4 つの制御ポイントの移動を指定します – 値の単位は譜スペースです。 (曲線が複数のセグメントを持つ場合、引数 displacements は 4 つのペアを持つリストのリストになります。)

\tweak 形式で用いる場合にのみ、先頭にハイフン - を付ける必要があります。

それでは、上記の例に \once \override 形式の \shape を使ってタイを 0.5 譜スペースだけ上に移動させてみましょう:

 
<<
  {
    \shape #'((0 . 0.5) (0 . 0.5) (0 . 0.5) (0 . 0.5)) Tie
    e'1~ 1
  }
\\
  \relative { r4 <g' c,> <g c,> <g c,> }
>>

[image of music]

タイの位置は改善されましたが、中央部分をもっと持ち上げるべきです。以下の例で \tweak 形式でそれを行っています:

 
<<
  {
    e'1-\shape #'((0 . 0.5) (0 . 1) (0 . 1) (0 . 0.5)) ~ e'
  }
\\
  \relative { r4 <g' c,> <g c,> <g c,> }
>>

[image of music]

同じ方法で制御ポイントを水平方向に移動させることもできて、同じ音楽タイミングで発生する 2 つの曲線をうまく配置することができます:

 
\relative {
  c''8(\( a) a'4 e c\)
  \shape #'((0.7 . -0.4) (0.5 . -0.4) (0.3 . -0.3) (0 . -0.2)) Slur
  \shape #'((0 . 0) (0 . 0.5) (0 . 0.5) (0 . 0)) PhrasingSlur
  c8(\( a) a'4 e c\)
}

[image of music]

\shape 関数は改行を跨ぐ曲線の制御ポイントを移動させることもできます。分割される曲線それぞれにリストを与えて制御ポイントを移動させます。片方の曲線は変更する必要がない場合、空のリストを渡します。以下の例では、1 つのスラーが改行で 2 つに分割されています:

 
\relative {
  c'4( f g c
  \break
  d,4 c' f, c)
}

[image of music]

分割されたスラーの形状を変更することで、改行を跨いで続くスラーであることがわかりやすくなります:

 
% 片方のスラーを変更する必要がない場合、
% () を ((0 . 0) (0 . 0) (0 . 0) (0 . 0)) の短縮形として使うことができます
\relative c' {
  \shape #'(
             (( 0 . 0) (0 . 0) (0 . 0) (0 . 1))
             ((0.5 . 1.5) (1 . 0) (0 . 0) (0 . -1.5))
           ) Slur
  c4( f g c
  \break
  d,4 c' f, c)
}

[image of music]

S 字曲線が求められた場合は、常に制御ポイントを手動で調節する必要があります — LilyPond が自動的にそのような形状を選択することはありません。

 
\relative c'' {
  c8( e b-> f d' a e-> g)
  \shape #'((0 . -1) (5.5 . -0.5) (-5.5 . -10.5) (0 . -5.5)) PhrasingSlur
  c8\( e b-> f d' a e-> g\)
}

[image of music]

制御ポイントの位置を明示的に指定する

ベジエ曲線の制御ポイントの座標を指定します – 単位は譜スペースです。X 座標はタイあるいはスラーを取り付ける音符の参照ポイントからの相対位置で、X 座標は譜の中央線からの相対位置です。制御ポイントの座標をリストで指定します – リストは数のペアを 4 つ持ちます。両端の座標を推測して、それから 2 つ中間点の座標を推測します。最適値はトライ&エラーで見つけます。音楽やレイアウトに変更が加えられた場合、手動で値を調節する必要があるということに注意してください。

制御ポイントを移動させるよりも、位置を明示的に指定する方が望ましいシチュエーションの 1 つは、単一の音符に関連付けられる曲線の場合です。ここで、そのような例を示します。繰り返しの差し替え部分まで延びるスラーを表示する方法を示しています。

 
\relative {
  c''1
  \repeat volta 3 { c4 d( e f }
  \alternative {
    { g2) d }
    {
      g2
      % スラーを作成して、新しい位置に移動させます
      % <> はスラーを終わらせるための空の和音です
      -\tweak control-points #'((-2 . 3.8) (-1 . 3.9) (0 . 4) (1 . 3.4)) ( <> )
      f,
    }
    {
      e'2
      % スラーを作成して、新しい位置に移動させます
      -\tweak control-points #'((-2 . 3) (-1 . 3.1) (0 . 3.2) (1 . 2.4)) ( <> )
      f,
    }
  }
}

[image of music]

既知の問題と警告

同じ音楽タイミングに複数のタイあるいはスラーが存在する場合、control-points プロパティを変更してもそれらの形状を変更することはできません。\tweak コマンドを用いたとしても変更できません。しかしながら、TieColumn の tie-configuration プロパティをオーバライドすることで、タイの垂直方向の位置と領域を変更することができます。

参照

内部リファレンス: (internals)TieColumn section ‘TieColumn’ in Internals Reference


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.5 改行するスパナを変更する

@translationof Modifying broken spanners


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

\alterBroken を使用する

@translationof Using alterBroken

スパナが改行や改ページにまたがる場合、それぞれの部分は元のスパナの属性を受け継ぎます。そのため、通常と同じようにスパナを変更することで、改行するスパナの各部分を変更することができます。下の例では thickness をオーバライドしていますが、改行するスラーの両方の部分が変更されています。

 
\relative c'' {
  r2
  \once\override Slur.thickness = 10
  c8( d e f
  \break
  g8 f e d) r2
}

[image of music]

\alterBroken コマンドを用いることで、改行するスパナの各部分をそれぞれ独立して変更することができます。このコマンドはスパナのプロパティを \override あるいは \tweak することができます。

\alterBroken の構文は:

 
[-]\alterBroken property values item

引数 values は値のリストを取り、スパナの各部分に対応します。item が Slur や Staff.PianoPedalBracket のような Grob の名前である場合、結果はその Grob の \override となります。item が “(” や “[” のような音楽表記である場合、\tweak が適用された音楽表記が出力されます。

\tweak 形では前にハイフンが必要です。\alterBroken を \override として用いる場合には、ハイフンを付けないでください。

\override として使用する場合、\alterBroken は \once や \temporary を前置することができ、\revert で元に戻すことができます ( (extending)Intermediate substitution functions section ‘Intermediate substitution functions’ in Extending を参照してください)。

次のコードは、前の例におけるスラーの各部分をそれぞれ \override しています。

 
\relative c'' {
  r2
  \alterBroken thickness #'(10 1) Slur
  c8( d e f
  \break
  g8 f e d) r2
}

[image of music]

\alterBroken コマンドは全てのスパナに対して用いることができます (例えば Tie, PhrasingSlur, Beam, TextSpanner などです)。例えば、校訂譜を作成する際には、原典に無いスラーを追加する際に点線で表示させたいことがあります。次の例ではこれをどのように実現するかを示しており、今回は \tweak 形を用いています:

 
% 空リストが dash-definition のデフォルト設定であり、
% 繋がった曲線が出力されます
\relative {
  c''2-\alterBroken dash-definition #'(() ((0 1.0 0.4 0.75))) \(e
  \break
  g2 e\)
}

[image of music]

\alterBroken において、values のリストの各要素がスパナの各部分のプロパティに影響するということは重要です。もしスパナの要素数よりも少ない数の値がセットされていた場合、残りの部分は空リストがセットされたとして扱われます。この時、プロパティのデフォルト値が空リストではない場合には意図しない結果をもたらす可能性があります。そのような場合には、各部分について正しい値をセットしてください。

既知の問題と警告

レイアウトが変更された場合、改行の位置も変更されることがあります。このように改行位置が変更されて、スパナの跨る行数が増減した場合、\alterBroken の設定は適切ではなくなるでしょう。明示的に \break を用いることによってこれを防止します。

\alterBroken コマンドは、direction のように、改行処理の前にアクセスされるプロパティに対しては効果がありません。

参照

拡張: (extending)Difficult tweaks section ‘Difficult tweaks’ in Extending


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]         [トップ] [目次] [インデックス] [ ? ]

5.5.6 unpure-pure コンテナ

@translationof Unpure-pure containers

unpure-pure コンテナは Y-axis スペース - 特に Y-offset と Y-extent - の算出をリテラル (つまり、数字やペア) ではなく、Scheme 関数で上書きする際に有用です。

ある特定のグラフィカル オブジェクトでは、Y-extent は stencil プロパティをベースにしていて、それらの stencil プロパティを上書きする場合は unpure-pure コンテナで Y-extent も上書きする必要があります。関数によって Y-offset と/または Y-extent を上書きした場合、その関数はコンパイルの最中の早すぎるタイミングで、改行の算出が行われるものと見なされます。そのため、その関数はまったく評価されず (通常、‘0’ または ‘'(0 . 0)’ の値を返します)、結果として衝突を引き起こすことがあります。‘pure’ 関数はプロパティ、オブジェクト、あるいはグラフィカル オブジェクトの消失に影響を与えないため、その関数の Y-axis に関する評価は常に正しく行われます。

現在のところ ‘pure’ と見なされる関数が約 30 あり、Unpure-pure コンテナを用いて ‘pure’ ではない関数を ‘pure’ な関数としてセットすることができます。‘pure’ 関数は改行の 前に 評価されるため、水平方向のスペースを ‘正しいタイミングで’ 調節することができます。‘unpure’ 関数は改行の 後に 評価されます。

Note: どの関数が ‘pure’ であるかを常に把握していることは困難なので、作成する ‘pure’ 関数ではグラフィカル オブジェクト Beam や VerticalAlignment を使わないことをおすすめします。

unpure-pure コンテナは以下のように構築します:

(ly:make-unpure-pure-container f0 f1)

ここで f0 は n (n >= 1) 個の引数を取る関数であり、最初の引数は常にグラフィカル オブジェクトである必要があります。これが実際に結果を返す関数です。f1 は ‘pure’ であると見なされる関数であり、n + 2 個の引数を取ります。f1 も最初の引数は常にグラフィカル オブジェクトである必要があり、2 番目と 3 番目の引数は ‘start’ と ‘end’ です。

start と end は事実上、Spanners (つまり、Hairpin や Beam) だけで問題となるダミー値であり、スパナが開始あるいは終了する段によって、高さの予想値が異なってくる場合に使用されるものです。

f1 の残りの引数は f0 の引数と同じです (n = 1 である場合は残りの引数はありません)。

関数 f1 の結果は概算であり、f0 が実際の値を得るのに用いられます。f0 の結果はもっと後のスペースの処理で微調整に用いられます。

 
#(define (square-line-circle-space grob)
(let* ((pitch (ly:event-property (ly:grob-property grob 'cause) 'pitch))
      (notename (ly:pitch-notename pitch)))
 (if (= 0 (modulo notename 2))
     (make-circle-stencil 0.5 0.0 #t)
     (make-filled-box-stencil '(0 . 1.0)
                              '(-0.5 . 0.5)))))

squareLineCircleSpace = {
  \override NoteHead.stencil = #square-line-circle-space
}

smartSquareLineCircleSpace = {
  \squareLineCircleSpace
  \override NoteHead.Y-extent =
   #(ly:make-unpure-pure-container
      ly:grob::stencil-height
      (lambda (grob start end) (ly:grob::stencil-height grob)))
}

\new Voice \with { \remove "Stem_engraver" }
\relative c'' {
  \squareLineCircleSpace
  cis4 ces disis d
  \smartSquareLineCircleSpace
  cis4 ces disis d
}

[image of music]

最初の小節では unpure-pure コンテナを用いていないため、スペース算出エンジンは符頭の幅を知ることができず、符頭と臨時記号が衝突しています。次の小節では unpure-pure コンテナを用いているため、スペース算出エンジンは符頭の幅を知ることができ、それに応じて小節の幅を増やすことで衝突を回避しています。

通常、簡単な計算では、unpure-pure コンテナの ‘unpure’ パートと ‘pure’ パートの両方に、引数の数とスコープを変えただけのほとんど同じ関数を用いることができます。このように使用されることが多いため、ly:make-unpure-pure-container に関数を 1 つだけ与えた場合、デフォルトで同じ関数を用いてコンテナを作り出します。

Note: ‘pure’ と見なした関数が ‘pure’ でなかった場合、予期しない結果となることがあります。


[ < ] [ > ]   [ << ] [ 上へ ] [ >> ]

This document was generated by gub on 7 月 13, 2020 using texi2html 1.82.

他の言語: English, català, deutsch, español, français, italiano
About automatic language selection.