5.5.6 unpure-pure コンテナ

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

ある特定のグラフィカル オブジェクトでは、Y-extentstencil プロパティをベースにしていて、それらの 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’ 関数ではグラフィカル オブジェクト BeamVerticalAlignment を使わないことをおすすめします。

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

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

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

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

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’ でなかった場合、予期しない結果となることがあります。


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