5.5.5 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’ です。

‘start’ と ‘end’ は事実上、Spanners (つまり、HairpinBeam) だけで問題となるダミー値であり、 start and end are, for all intents and purposes, dummy values that only matter for Spanners (i.e Hairpin or Beam), that can return different height estimations based on a starting and ending column.

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’ パートの両方に、引数の数とスコープを変えただけのほとんど同じ関数を用いることができます。

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


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

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