[ << デフォルトを変更する ] | [Top][Contents][Index] | [ 付表 >> ] |
[ < \alterBroken を使用する ] | [ Up : 高度な調整 ] | [ 音楽関数を使用する > ] |
5.5.6 unpure-pure コンテナ
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 }
最初の小節では unpure-pure コンテナを用いていないため、スペース算出エンジンは符頭の幅を知ることができず、符頭と臨時記号が衝突しています。次の小節では unpure-pure コンテナを用いているため、スペース算出エンジンは符頭の幅を知ることができ、それに応じて小節の幅を増やすことで衝突を回避しています。
通常、簡単な計算では、unpure-pure コンテナの ‘unpure’ パートと ‘pure’ パートの両方に、引数の数とスコープを変えただけのほとんど同じ関数を用いることができます。このように使用されることが多いため、ly:make-unpure-pure-container
に関数を 1 つだけ与えた場合、デフォルトで同じ関数を用いてコンテナを作り出します。
Note: ‘pure’ と見なした関数が ‘pure’ でなかった場合、予期しない結果となることがあります。
[ << デフォルトを変更する ] | [Top][Contents][Index] | [ 付表 >> ] |
[ < \alterBroken を使用する ] | [ Up : 高度な調整 ] | [ 音楽関数を使用する > ] |