LilyPond 記譜法リファレンス: 5.5.6 unpure-pure コンテナ

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

#### LilyPond — 記譜法リファレンス v2.22.2 (安定版).

- 2. 専門的な記譜法
- 3. 入出力全般
- 4. スペースの問題
- 5. デフォルトを変更する
- A. 付表
- B. カンニング ペーパー
- C. GNU Free Documentation License
- D. LilyPond コマンド インデックス
- E. LilyPond インデックス