]> git.donarmstrong.com Git - lilypond.git/blob - scm/define-grobs.scm
Metronome-mark: align on key-signature too.
[lilypond.git] / scm / define-grobs.scm
1 ;;;; This file is part of LilyPond, the GNU music typesetter.
2 ;;;;
3 ;;;; Copyright (C) 1998--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
4 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;;
6 ;;;; LilyPond is free software: you can redistribute it and/or modify
7 ;;;; it under the terms of the GNU General Public License as published by
8 ;;;; the Free Software Foundation, either version 3 of the License, or
9 ;;;; (at your option) any later version.
10 ;;;;
11 ;;;; LilyPond is distributed in the hope that it will be useful,
12 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ;;;; GNU General Public License for more details.
15 ;;;;
16 ;;;; You should have received a copy of the GNU General Public License
17 ;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
18
19 ;;;; distances are given in line-thickness (thicknesses) and
20 ;;;; staff-space (distances)
21
22 ;;;; WARNING: the meta field should be the last one.
23 ;;;; WARNING: don't use anonymous functions for initialization.
24
25 ;; TODO: junk the meta field in favor of something more compact?
26
27 (define-public all-grob-descriptions
28   `(
29     (Accidental
30      . (
31         (alteration . ,accidental-interface::calc-alteration)
32         (avoid-slur . inside)
33         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
34         (stencil . ,ly:accidental-interface::print)
35         (X-extent . ,ly:accidental-interface::width)
36         (Y-extent . ,ly:accidental-interface::height)
37         (meta . ((class . Item)
38                  (interfaces . (accidental-interface
39                                 font-interface))))))
40
41     (AccidentalCautionary
42      . (
43         (alteration . ,accidental-interface::calc-alteration)
44         (avoid-slur . inside)
45         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
46         (parenthesized . #t)
47         (stencil . ,ly:accidental-interface::print)
48         (Y-extent . ,ly:accidental-interface::height)
49         (meta . ((class . Item)
50                  (interfaces . (accidental-interface
51                                 font-interface))))))
52
53     (AccidentalPlacement
54      . (
55         (direction .  ,LEFT)
56         (positioning-done . ,ly:accidental-placement::calc-positioning-done)
57
58         ;; this is quite small, but it is very ugly to have
59         ;; accs closer to the previous note than to the next one.
60         (right-padding . 0.15)
61
62         ;; for horizontally stacked scripts.
63         (script-priority .  -100)
64
65         (X-extent . ,ly:axis-group-interface::width)
66         (meta . ((class . Item)
67                  (interfaces . (accidental-placement-interface))))))
68
69     (AccidentalSuggestion
70      . (
71         (alteration . ,accidental-interface::calc-alteration)
72         (direction . ,UP)
73         (font-size . -2)
74         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
75         (outside-staff-priority . 0)
76         (script-priority . 0)
77         (self-alignment-X . ,CENTER)
78         (side-axis . ,Y)
79         (staff-padding . 0.25)
80         (stencil . ,ly:accidental-interface::print)
81         (X-extent . ,ly:accidental-interface::width)
82         (X-offset . ,(ly:make-simple-closure
83                       `(,+
84                         ,(ly:make-simple-closure
85                           (list ly:self-alignment-interface::centered-on-x-parent))
86                         ,(ly:make-simple-closure
87                           (list ly:self-alignment-interface::x-aligned-on-self)))))
88         (Y-extent . ,ly:accidental-interface::height)
89         (Y-offset . ,ly:side-position-interface::y-aligned-side)
90         (meta . ((class . Item)
91                  (interfaces . (accidental-interface
92                                 accidental-suggestion-interface
93                                 font-interface
94                                 script-interface
95                                 self-alignment-interface
96                                 side-position-interface))))))
97
98     (Ambitus
99      . (
100         (axes . (,X ,Y))
101         (break-align-symbol . ambitus)
102         (break-visibility . ,begin-of-line-visible)
103         (non-musical . #t)
104         (space-alist . (
105                         (clef . (extra-space . 0.5))
106                         (key-signature . (extra-space . 0.0))
107                         (staff-bar . (extra-space . 0.0))
108                         (time-signature . (extra-space . 0.0))
109                         (first-note . (fixed-space . 0.0))))
110         (X-extent . ,ly:axis-group-interface::width)
111         (Y-extent . ,ly:axis-group-interface::height)
112         (meta . ((class . Item)
113                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
114                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
115                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
116                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
117                  (interfaces . (ambitus-interface
118                                 axis-group-interface
119                                 break-aligned-interface))))))
120
121     (AmbitusAccidental
122      . (
123         (direction . ,LEFT)
124         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
125         (padding . 0.5)
126         (side-axis . ,X)
127         (stencil . ,ly:accidental-interface::print)
128         (X-offset . ,ly:side-position-interface::x-aligned-side)
129         (Y-extent . ,ly:accidental-interface::height)
130         (meta . ((class . Item)
131                  (interfaces . (accidental-interface
132                                 break-aligned-interface
133                                 font-interface
134                                 side-position-interface))))))
135
136     (AmbitusLine
137      . (
138         (gap . 0.35)
139         (stencil . ,ambitus::print)
140         (thickness . 2)
141         (X-offset . ,ly:self-alignment-interface::centered-on-x-parent)
142         (meta . ((class . Item)
143                  (interfaces . (ambitus-interface
144                                 font-interface))))))
145
146     (AmbitusNoteHead
147      . (
148         (duration-log . 2)
149         (glyph-name . ,note-head::calc-glyph-name)
150         (stencil . ,ly:note-head::print)
151         (Y-offset . ,ly:staff-symbol-referencer::callback)
152         (meta . ((class . Item)
153                  (interfaces . (ambitus-interface
154                                 font-interface
155                                 ledgered-interface
156                                 note-head-interface
157                                 rhythmic-head-interface
158                                 staff-symbol-referencer-interface))))))
159
160     (Arpeggio
161      . (
162         (direction . ,LEFT)
163         (padding . 0.5)
164         (positions . ,ly:arpeggio::calc-positions)
165         (script-priority . 0)
166         (side-axis . ,X)
167         (staff-position . 0.0)
168         (stencil . ,ly:arpeggio::print)
169         (X-extent . ,ly:arpeggio::width)
170         (X-offset . ,ly:side-position-interface::x-aligned-side)
171         (Y-offset . ,ly:staff-symbol-referencer::callback)
172         (meta . ((class . Item)
173                  (interfaces . (arpeggio-interface
174                                 font-interface
175                                 side-position-interface
176                                 staff-symbol-referencer-interface))))))
177
178     (BalloonTextItem
179      . (
180         (stencil . ,ly:balloon-interface::print)
181         (text . ,(grob::calc-property-by-copy 'text))
182         (X-offset . ,(grob::calc-property-by-copy 'X-offset))
183         (Y-offset . ,(grob::calc-property-by-copy 'Y-offset))
184         (meta . ((class . Item)
185                  (interfaces . (balloon-interface
186                                 font-interface
187                                 text-interface))))))
188
189     (BarLine
190      . (
191         (allow-span-bar . #t)
192         (bar-extent . ,ly:bar-line::calc-bar-extent)
193         (bar-size .  ,ly:bar-line::calc-bar-size)
194         (break-align-anchor . ,ly:bar-line::calc-anchor)
195         (break-align-symbol . staff-bar)
196         (break-visibility . ,bar-line::calc-break-visibility)
197         (gap . 0.4)
198         (glyph . "|")
199         (glyph-name . ,bar-line::calc-glyph-name)
200
201         ;;
202         ;; Ross. page 151 lists other values, we opt for a leaner look
203         ;;
204         ;; TODO:
205         ;; kern should scale with line-thickness too.
206         (kern . 3.0)
207         (thin-kern . 3.0)
208         (hair-thickness . 1.9)
209         (thick-thickness . 6.0)
210
211         (layer . 0)
212         (non-musical . #t)
213         (space-alist . (
214                         (time-signature . (extra-space . 0.75))
215                         (custos . (minimum-space . 2.0))
216                         (clef . (minimum-space . 1.0))
217                         (key-signature . (extra-space . 1.0))
218                         (key-cancellation . (extra-space . 1.0))
219                         (first-note . (fixed-space . 1.3))
220                         (next-note . (semi-fixed-space . 0.9))
221                         (right-edge . (extra-space . 0.0))))
222         (stencil . ,ly:bar-line::print)
223         (meta . ((class . Item)
224                  (interfaces . (bar-line-interface
225                                 break-aligned-interface
226                                 font-interface))))))
227
228     (BarNumber
229      . (
230         (after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
231         ;; want the bar number before the clef at line start.
232         (break-align-symbols . (left-edge staff-bar))
233
234         (break-visibility . ,begin-of-line-visible)
235         (direction . ,UP)
236         (font-family . roman)
237         (font-size . -2)
238         (non-musical . #t)
239         (outside-staff-priority . 100)
240         (padding . 1.0)
241         (self-alignment-X . ,RIGHT)
242         (side-axis . ,Y)
243         (stencil . ,ly:text-interface::print)
244         (X-offset . ,(ly:make-simple-closure
245                       `(,+
246                         ,(ly:make-simple-closure
247                           (list ly:break-alignable-interface::self-align-callback))
248                         ,(ly:make-simple-closure
249                           (list ly:self-alignment-interface::x-aligned-on-self)))))
250         (Y-offset . ,ly:side-position-interface::y-aligned-side)
251         (meta .
252               ((class . Item)
253                (interfaces . (break-alignable-interface
254                               font-interface
255                               self-alignment-interface
256                               side-position-interface
257                               text-interface))))))
258
259     (BassFigure
260      . (
261         (stencil . ,ly:text-interface::print)
262         (meta . ((class . Item)
263                  (interfaces . (bass-figure-interface
264                                 font-interface
265                                 rhythmic-grob-interface
266                                 text-interface))))))
267
268     (BassFigureAlignment
269      . (
270         (axes . (,Y))
271         (padding . 0.2)
272         (positioning-done . ,ly:align-interface::align-to-minimum-distances)
273         (stacking-dir . ,DOWN)
274         (Y-extent . ,ly:axis-group-interface::height)
275         (meta . ((class . Spanner)
276                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
277                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
278                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
279                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
280                  (interfaces . (align-interface
281                                 axis-group-interface
282                                 bass-figure-alignment-interface))))))
283
284     (BassFigureAlignmentPositioning
285      . (
286         (axes . (,Y))
287         (direction . ,UP)
288         (padding . 0.5)
289         (side-axis . ,Y)
290         (staff-padding . 1.0)
291         (Y-extent . ,ly:axis-group-interface::height)
292         (Y-offset . ,ly:side-position-interface::y-aligned-side)
293         (meta . ((class . Spanner)
294                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
295                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
296                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
297                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
298                  (interfaces . (axis-group-interface
299                                 side-position-interface))))))
300
301     (BassFigureBracket
302      . (
303         (edge-height . (0.2 . 0.2))
304         (stencil . ,ly:enclosing-bracket::print)
305         (X-extent . ,ly:enclosing-bracket::width)
306         (meta . ((class . Item)
307                  (interfaces . (enclosing-bracket-interface))))))
308
309     (BassFigureContinuation
310      . (
311         (stencil . ,ly:figured-bass-continuation::print)
312         (Y-offset . ,ly:figured-bass-continuation::center-on-figures)
313         (meta . ((class . Spanner)
314                  (interfaces . (figured-bass-continuation-interface))))))
315
316     (BassFigureLine
317      . (
318         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
319         (axes . (,Y))
320         (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
321         (Y-extent . ,ly:axis-group-interface::height)
322         (meta . ((class . Spanner)
323                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
324                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
325                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
326                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
327                  (interfaces . (axis-group-interface))))))
328
329
330     (Beam
331      . (
332         ;; todo: clean this up a bit: the list is getting
333         ;; rather long.
334
335         (auto-knee-gap . 5.5)
336         (beam-thickness . 0.48) ; in staff-space
337
338         ;; We have some unreferenced problems here.
339         ;;
340         ;; If we shorten beamed stems less than normal stems (1 staff-space),
341         ;; or high order less than 8th beams, patterns like
342         ;;     c''4 [c''8 c''] c''4 [c''16 c]
343         ;; are ugly (different stem lengths).
344         ;;
345         ;; But if we shorten 16th beams as much as 8th beams, a single
346         ;; forced 16th beam looks *very* short.
347
348         ;; We choose to shorten 8th beams the same as single stems,
349         ;; and high order beams less than 8th beams, so that all
350         ;; isolated shortened beams look nice and a bit shortened,
351         ;; sadly possibly breaking patterns with high order beams.
352         (beamed-stem-shorten . (1.0 0.5 0.25))
353
354         (beaming . ,ly:beam::calc-beaming)
355         (clip-edges . #t)
356         (concaveness . ,ly:beam::calc-concaveness)
357         (cross-staff . ,ly:beam::calc-cross-staff)
358         (damping . 1)
359         (details
360          .(
361            (secondary-beam-demerit . 10)
362            (stem-length-demerit-factor . 5)
363            (region-size . 2)
364            (beam-eps . 0.001)
365            (stem-length-limit-penalty . 5000)
366            (damping-direction-penalty . 800)
367            (hint-direction-penalty . 20)
368            (musical-direction-factor . 400)
369            (ideal-slope-factor . 10)
370            (round-to-zero-slope . 0.02)))
371         (direction . ,ly:beam::calc-direction)
372
373         ;; only for debugging.
374         (font-family . roman)
375
376         (gap . 0.8)
377         (neutral-direction . ,DOWN)
378         (positions .  ,(ly:make-simple-closure
379                         (ly:make-simple-closure
380                          (list chain-grob-member-functions
381                            `(,cons 0 0)
382                            ly:beam::calc-least-squares-positions
383                            ly:beam::slope-damping
384                            ly:beam::shift-region-to-valid
385                            ly:beam::quanting
386                            ))))
387
388         ;; this is a hack to set stem lengths, if positions is set.
389         (quantized-positions . ,ly:beam::set-stem-lengths)
390
391         (shorten . ,ly:beam::calc-stem-shorten)
392         (stencil . ,ly:beam::print)
393
394         (meta . ((class . Spanner)
395                  (object-callbacks . ((normal-stems . ,ly:beam::calc-normal-stems)))
396                  (interfaces . (beam-interface
397                                 font-interface
398                                 staff-symbol-referencer-interface
399                                 unbreakable-spanner-interface))))))
400
401     (BendAfter
402      . (
403         (minimum-length . 0.5)
404         (stencil . ,bend::print)
405         (thickness . 2.0)
406         (meta . ((class . Spanner)
407                  (interfaces . (bend-after-interface
408                                 spanner-interface))))))
409
410     (BreakAlignGroup
411      . (
412         (axes . (,X))
413         (break-align-anchor . ,ly:break-aligned-interface::calc-average-anchor)
414         (break-visibility . ,ly:break-aligned-interface::calc-break-visibility)
415         (X-extent . ,ly:axis-group-interface::width)
416         (meta . ((class . Item)
417                  (interfaces . (axis-group-interface
418                                 break-aligned-interface))))))
419
420     (BreakAlignment
421      . (
422         (axes . (,X))
423         (break-align-orders . ;; end of line
424                             #((
425                                left-edge
426                                ambitus
427                                breathing-sign
428                                clef
429                                staff-bar
430                                key-cancellation
431                                key-signature
432                                time-signature
433                                metronome-mark
434                                custos)
435
436                               ;; unbroken
437                               (
438                                left-edge
439                                ambitus
440                                breathing-sign
441                                clef
442                                staff-bar
443                                key-cancellation
444                                key-signature
445                                time-signature
446                                metronome-mark
447                                custos)
448
449                               ;; begin of line
450                               (
451                                left-edge
452                                ambitus
453                                breathing-sign
454                                clef
455                                key-cancellation
456                                key-signature
457                                staff-bar
458                                time-signature
459                                metronome-mark
460                                custos)))
461         (non-musical . #t)
462         (positioning-done . ,ly:break-alignment-interface::calc-positioning-done)
463         (stacking-dir . 1)
464         (X-extent . ,ly:axis-group-interface::width)
465         (meta . ((class . Item)
466                  (interfaces . (axis-group-interface
467                                 break-alignment-interface))))))
468
469     (BreathingSign
470      . (
471         (break-align-symbol . breathing-sign)
472         (break-visibility . ,begin-of-line-invisible)
473         (non-musical . #t)
474         (space-alist . (
475                         (ambitus . (extra-space . 2.0))
476                         (custos . (minimum-space . 1.0))
477                         (key-signature . (minimum-space . 1.5))
478                         (time-signature . (minimum-space . 1.5))
479                         (staff-bar . (minimum-space . 1.5))
480                         (clef . (minimum-space . 2.0))
481                         (first-note . (fixed-space . 1.0)) ;huh?
482                         (right-edge . (extra-space . 0.1))))
483         (stencil . ,ly:text-interface::print)
484         (text . ,(make-musicglyph-markup "scripts.rcomma"))
485         (Y-offset . ,ly:breathing-sign::offset-callback)
486         (meta . ((class . Item)
487                  (interfaces . (break-aligned-interface
488                                 breathing-sign-interface
489                                 font-interface
490                                 text-interface))))))
491
492     (ChordName
493      . (
494         (after-line-breaking . ,ly:chord-name::after-line-breaking)
495         (font-family . sans)
496         (font-size . 1.5)
497         (stencil . ,ly:text-interface::print)
498         (word-space . 0.0)
499         (meta . ((class . Item)
500                  (interfaces . (chord-name-interface
501                                 font-interface
502                                 rhythmic-grob-interface
503                                 text-interface))))))
504
505     (Clef
506      . (
507         (avoid-slur . inside)
508         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
509         (break-align-symbol . clef)
510         (break-visibility . ,begin-of-line-visible)
511         (glyph-name . ,ly:clef::calc-glyph-name)
512         (non-musical . #t)
513         (space-alist . ((ambitus . (extra-space . 2.0))
514                         (staff-bar . (extra-space . 0.7))
515                         (key-cancellation . (minimum-space . 3.5))
516                         (key-signature . (minimum-space . 3.5))
517                         (time-signature . (minimum-space . 4.2))
518                         (first-note . (minimum-fixed-space . 5.0))
519                         (next-note . (extra-space . 0.5))
520                         (right-edge . (extra-space . 0.5))))
521         (stencil . ,ly:clef::print)
522         (extra-spacing-height . (-0.5 . 0.5))
523         (Y-offset . ,ly:staff-symbol-referencer::callback)
524         (meta . ((class . Item)
525                  (interfaces . (break-aligned-interface
526                                 clef-interface
527                                 font-interface
528                                 staff-symbol-referencer-interface))))))
529
530     (ClusterSpanner
531      . (
532         (cross-staff . ,ly:cluster::calc-cross-staff)
533         (minimum-length . 0.0)
534         (padding . 0.25)
535         (springs-and-rods . ,ly:spanner::set-spacing-rods)
536         (stencil . ,ly:cluster::print)
537         (style . ramp)
538         (meta . ((class . Spanner)
539                  (interfaces . (cluster-interface))))))
540
541     (ClusterSpannerBeacon
542      . (
543         (Y-extent . ,ly:cluster-beacon::height)
544         (meta . ((class . Item)
545                  (interfaces . (cluster-beacon-interface
546                                 rhythmic-grob-interface))))))
547
548     (CombineTextScript
549      . (
550         (avoid-slur . outside)
551         (baseline-skip . 2)
552         (direction . ,UP)
553         (extra-spacing-width . (+inf.0 . -inf.0))
554         (font-series . bold)
555         (outside-staff-priority . 450)
556         (padding . 0.5)
557         (script-priority . 200)
558         (side-axis . ,Y)
559         (staff-padding . 0.5)
560         ;; todo: add X self alignment?
561         (stencil . ,ly:text-interface::print)
562         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
563         (Y-offset . ,ly:side-position-interface::y-aligned-side)
564         (meta . ((class . Item)
565                  (interfaces . (font-interface
566                                 side-position-interface
567                                 text-interface
568                                 text-script-interface))))))
569
570     (Custos
571      . (
572         (break-align-symbol . custos)
573         (break-visibility . ,end-of-line-visible)
574         (neutral-direction . ,DOWN)
575         (non-musical . #t)
576         (space-alist . (
577                         (first-note . (minimum-fixed-space . 0.0))
578                         (right-edge . (extra-space . 0.1))))
579         (stencil . ,ly:custos::print)
580         (style . vaticana)
581         (Y-offset . ,ly:staff-symbol-referencer::callback)
582         (meta . ((class . Item)
583                  (interfaces  . (break-aligned-interface
584                                  custos-interface
585                                  font-interface
586                                  staff-symbol-referencer-interface))))))
587
588     (DotColumn
589      . (
590         (axes . (,X))
591         (direction . ,RIGHT)
592         (positioning-done . ,ly:dot-column::calc-positioning-done)
593         (X-extent . ,ly:axis-group-interface::width)
594         (meta . ((class . Item)
595                  (interfaces . (axis-group-interface
596                                 dot-column-interface))))))
597
598     (Dots
599      . (
600         (dot-count . ,dots::calc-dot-count)
601         (staff-position . ,dots::calc-staff-position)
602         (stencil . ,ly:dots::print)
603         (extra-spacing-height . (-0.5 . 0.5))
604         (meta . ((class . Item)
605                  (interfaces . (dots-interface
606                                 font-interface
607                                 staff-symbol-referencer-interface))))))
608
609     (DoublePercentRepeat
610      . (
611         (break-align-symbol . staff-bar)
612         (break-visibility . ,begin-of-line-invisible)
613         (dot-negative-kern . 0.75)
614         (font-encoding . fetaMusic)
615         (non-musical . #t)
616         (slash-negative-kern . 1.6)
617         (slope . 1.0)
618         (stencil . ,ly:percent-repeat-item-interface::double-percent)
619         (thickness . 0.48)
620         (width . 2.0)
621         (meta . ((class . Item)
622                  (interfaces . (break-aligned-interface
623                                 font-interface
624                                 percent-repeat-interface
625                                 percent-repeat-item-interface))))))
626
627     (DoublePercentRepeatCounter
628      . (
629         (direction . ,UP)
630         (font-encoding . fetaText)
631         (font-size . -2)
632         (padding . 0.2)
633         (self-alignment-X . ,CENTER)
634         (side-axis . ,Y)
635         (staff-padding . 0.25)
636         (stencil . ,ly:text-interface::print)
637         (X-offset . ,(ly:make-simple-closure
638                       `(,+
639                         ,(ly:make-simple-closure
640                           (list ly:self-alignment-interface::centered-on-y-parent))
641                         ,(ly:make-simple-closure
642                           (list ly:self-alignment-interface::x-aligned-on-self)))))
643         (Y-offset . ,ly:side-position-interface::y-aligned-side)
644         (meta . ((class . Item)
645                  (interfaces . (font-interface
646                                 percent-repeat-interface
647                                 percent-repeat-item-interface
648                                 self-alignment-interface
649                                 side-position-interface
650                                 text-interface))))))
651
652     (DynamicLineSpanner
653      . (
654         (axes . (,Y))
655         (cross-staff . ,ly:side-position-interface::calc-cross-staff)
656         (direction . ,DOWN)
657         (minimum-space . 1.2)
658         (outside-staff-priority . 250)
659         (padding . 0.6)
660         (side-axis . ,Y)
661         (slur-padding . 0.3)
662         (staff-padding . 0.1)
663         (X-extent . ,ly:axis-group-interface::width)
664         (Y-extent . ,ly:axis-group-interface::height)
665         (Y-offset . ,ly:side-position-interface::y-aligned-side)
666         (meta . ((class . Spanner)
667                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
668                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
669                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
670                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
671                  (interfaces . (axis-group-interface
672                                 dynamic-interface
673                                 dynamic-line-spanner-interface
674                                 side-position-interface))))))
675
676     (DynamicText
677      . (
678
679         ;; todo.
680
681         (direction . ,ly:script-interface::calc-direction)
682         (extra-spacing-width . (+inf.0 . -inf.0))
683         (font-encoding . fetaText)
684         (font-series . bold)
685         (font-shape . italic)
686         (outside-staff-priority . 250)
687         (positioning-done . ,ly:script-interface::calc-positioning-done)
688         (right-padding . 0.5)
689         (self-alignment-X . ,CENTER)
690         (self-alignment-Y . ,CENTER)
691         (stencil . ,ly:text-interface::print)
692         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
693         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
694         (meta . ((class . Item)
695                  (interfaces . (dynamic-interface
696                                 dynamic-text-interface
697                                 font-interface
698                                 script-interface
699                                 self-alignment-interface
700                                 text-interface))))))
701
702     (DynamicTextSpanner
703      . (
704         (before-line-breaking . ,dynamic-text-spanner::before-line-breaking)
705         (bound-details . ((right . ((attach-dir .  ,LEFT)
706                                     (Y . 0)
707                                     (padding . 0.75)
708                                     ))
709                           (right-broken . ((attach-dir .  ,RIGHT)
710                                     (padding . 0.0)
711                                     ))
712
713                           (left . ((attach-dir .  ,LEFT)
714                                    (Y . 0)
715                                    (stencil-offset . (-0.75 . -0.5))
716                                    (padding . 0.75)
717                                    ))
718                           (left-broken . ((attach-dir .  ,RIGHT)
719                                    ))
720                           ))
721         (dash-fraction . 0.2)
722         (dash-period . 3.0)
723
724         ;; rather ugh with NCSB
725         ;; (font-series . bold)
726         (font-shape . italic)
727
728         ;; need to blend with dynamic texts.
729         (font-size . 1)
730
731         (left-bound-info . ,ly:line-spanner::calc-left-bound-info-and-text)
732
733         ;; make sure the spanner doesn't get too close to notes
734         (minimum-Y-extent . (-1 . 1))
735
736         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
737         (stencil . ,ly:line-spanner::print)
738         (style . dashed-line)
739         (meta . ((class . Spanner)
740                  (interfaces . (dynamic-interface
741                                 dynamic-text-spanner-interface
742                                 font-interface
743                                 line-interface
744                                 line-spanner-interface
745                                 spanner-interface
746                                 text-interface))))))
747
748
749     (Episema
750      . (
751         (bound-details . ((left . ((Y . 0)
752                                    (padding . 0)
753                                    (attach-dir . ,LEFT)
754                                    ))
755                           (right . ((Y . 0)
756                                     (padding . 0)
757                                     (attach-dir . ,RIGHT)
758                                     ))
759                           ))
760         (direction . ,UP)
761         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
762         (quantize-position . #t)
763         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
764         (side-axis . ,Y)
765         (stencil . ,ly:line-spanner::print)
766         (style . line)
767         (Y-offset . ,ly:side-position-interface::y-aligned-side)
768         (meta . ((class . Spanner)
769                  (interfaces . (episema-interface
770                                 font-interface
771                                 line-interface
772                                 line-spanner-interface
773                                 side-position-interface))))))
774
775
776     (Fingering
777      . (
778
779         ;; sync with TextScript (?)
780
781         (avoid-slur . around)
782         (cross-staff . ,ly:side-position-interface::calc-cross-staff)
783         (direction . ,ly:script-interface::calc-direction)
784         (font-encoding . fetaText)
785         (font-size . -5)                ; don't overlap when next to heads.
786         (padding . 0.5)
787         (positioning-done . ,ly:script-interface::calc-positioning-done)
788         (script-priority . 100)
789         (self-alignment-X . ,CENTER)
790         (self-alignment-Y . ,CENTER)
791         (slur-padding . 0.2)
792         (staff-padding . 0.5)
793         (stencil . ,ly:text-interface::print)
794         (text . ,fingering::calc-text)
795         (meta . ((class . Item)
796                  (interfaces . (finger-interface
797                                 font-interface
798                                 self-alignment-interface
799                                 side-position-interface
800                                 text-interface
801                                 text-script-interface))))))
802
803     (FretBoard
804      . (
805         (after-line-breaking . ,ly:chord-name::after-line-breaking)
806         (fret-diagram-details . ((finger-code . below-string)))
807         (stencil . ,fret-board::calc-stencil)
808         (meta . ((class . Item)
809                  (interfaces . (chord-name-interface
810                                 font-interface
811                                 fret-diagram-interface
812                                 rhythmic-grob-interface))))))
813
814
815     (Glissando
816      . (
817         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
818         (bound-details . ((right . ((attach-dir .  ,CENTER)
819                                     (padding . 1.5)
820                                       ))
821                           (left . ((attach-dir .  ,CENTER)
822                                    (padding . 1.5)
823                                       ))
824                           ))
825         (gap . 0.5)
826         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
827         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
828         (stencil . ,ly:line-spanner::print)
829         (style . line)
830         (X-extent . #f)
831         (Y-extent . #f)
832         (zigzag-width . 0.75)
833         (meta . ((class . Spanner)
834                  (interfaces . (line-interface
835                                 line-spanner-interface
836                                 unbreakable-spanner-interface))))))
837
838     (GraceSpacing
839      . (
840         (common-shortest-duration . ,grace-spacing::calc-shortest-duration)
841         (shortest-duration-space . 1.6)
842         (spacing-increment . 0.8)
843         (meta . ((class . Spanner)
844                  (interfaces . (grace-spacing-interface
845                                 spacing-options-interface
846                                 spanner-interface))))))
847
848     (GridLine
849      . (
850         (layer . 0)
851         (self-alignment-X . ,CENTER)
852         (stencil . ,ly:grid-line-interface::print)
853         (X-extent  . ,ly:grid-line-interface::width)
854         (X-offset . ,(ly:make-simple-closure
855                       `(,+
856                         ,(ly:make-simple-closure
857                           (list ly:self-alignment-interface::centered-on-x-parent))
858                         ,(ly:make-simple-closure
859                           (list ly:self-alignment-interface::x-aligned-on-self)))))
860         (meta . ((class . Item)
861                  (interfaces . (grid-line-interface
862                                 self-alignment-interface))))))
863
864     (GridPoint
865      . (
866         (X-extent . (0 . 0))
867         (Y-extent . (0 . 0))
868         (meta . ((class . Item)
869                  (interfaces . (grid-point-interface))))))
870
871
872     (Hairpin
873      . (
874         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
875         (bound-padding . 1.0)
876         (circled-tip . #f)
877         (grow-direction . ,hairpin::calc-grow-direction)
878         (height . 0.6666)
879         (minimum-length . 2.0)
880         (self-alignment-Y . ,CENTER)
881         (springs-and-rods . ,ly:spanner::set-spacing-rods)
882         (stencil . ,ly:hairpin::print)
883         (thickness . 1.0)
884         (to-barline . #t)
885         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
886         (meta . ((class . Spanner)
887                  (interfaces . (dynamic-interface
888                                 hairpin-interface
889                                 line-interface
890                                 self-alignment-interface
891                                 spanner-interface))))))
892
893     (HarmonicParenthesesItem
894      . (
895         (padding . 0)
896         (stencil . ,parentheses-item::print)
897         (stencils . ,parentheses-item::calc-angled-bracket-stencils)
898         (meta . ((class . Item)
899                  (interfaces . (font-interface
900                                 parentheses-interface))))))
901
902     (HorizontalBracket
903      . (
904         (bracket-flare . (0.5 . 0.5))
905         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
906         (direction . ,DOWN)
907         (padding . 0.2)
908         (side-axis . ,Y)
909         (staff-padding . 0.2)
910         (stencil . ,ly:horizontal-bracket::print)
911         (thickness . 1.0)
912         (Y-offset . ,ly:side-position-interface::y-aligned-side)
913         (meta . ((class . Spanner)
914                  (interfaces . (horizontal-bracket-interface
915                                 line-interface
916                                 side-position-interface
917                                 spanner-interface))))))
918
919
920     (InstrumentName
921      . (
922         (direction . ,LEFT)
923         (padding . 0.3)
924         (self-alignment-X . ,CENTER)
925         (self-alignment-Y . ,CENTER)
926         (stencil . ,system-start-text::print)
927         (X-offset . ,system-start-text::calc-x-offset)
928         (Y-offset . ,system-start-text::calc-y-offset)
929         (meta . ((class . Spanner)
930                  (interfaces . (font-interface
931                                 self-alignment-interface
932                                 side-position-interface
933                                 system-start-text-interface))))))
934
935     (InstrumentSwitch
936      . (
937         (direction . ,UP)
938         (extra-spacing-width . (+inf.0 . -inf.0))
939         (outside-staff-priority . 500)
940         (padding . 0.5)
941         (self-alignment-X . ,LEFT)
942         (side-axis . ,Y)
943         (staff-padding . 0.5)
944         (stencil . ,ly:text-interface::print)
945         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
946         (Y-offset . ,ly:side-position-interface::y-aligned-side)
947         (meta . ((class . Item)
948                  (interfaces . (font-interface
949                                 self-alignment-interface
950                                 side-position-interface
951                                 text-interface))))))
952
953
954     (KeyCancellation
955      . (
956         (break-align-symbol . key-cancellation)
957         (break-visibility . ,begin-of-line-invisible)
958         (glyph-name-alist . ,cancellation-glyph-name-alist)
959         (non-musical . #t)
960         (space-alist . (
961                         (time-signature . (extra-space . 1.25))
962                         (staff-bar . (extra-space . 0.6))
963                         (key-signature . (extra-space . 0.5))
964                         (right-edge . (extra-space . 0.5))
965                         (first-note . (fixed-space . 2.5))))
966         (stencil . ,ly:key-signature-interface::print)
967         (Y-offset . ,ly:staff-symbol-referencer::callback)
968         (meta . ((class . Item)
969                  (interfaces . (break-aligned-interface
970                                 font-interface
971                                 key-cancellation-interface
972                                 key-signature-interface
973                                 staff-symbol-referencer-interface))))))
974
975     (KeySignature
976      . (
977         (avoid-slur . inside)
978         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
979         (break-align-symbol . key-signature)
980         (break-visibility . ,begin-of-line-visible)
981         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
982         (non-musical . #t)
983         (space-alist . (
984                         (time-signature . (extra-space . 1.15))
985                         (staff-bar . (extra-space . 1.1))
986                         (right-edge . (extra-space . 0.5))
987                         (first-note . (fixed-space . 2.5))))
988         (stencil . ,ly:key-signature-interface::print)
989         (Y-offset . ,ly:staff-symbol-referencer::callback)
990         (meta . ((class . Item)
991                  (interfaces . (break-aligned-interface
992                                 font-interface
993                                 key-signature-interface
994                                 staff-symbol-referencer-interface))))))
995
996
997    (LaissezVibrerTie
998      . (
999         (control-points . ,ly:semi-tie::calc-control-points)
1000         (details . ((ratio . 0.333)
1001                     (height-limit . 1.0)))
1002         (direction . ,ly:tie::calc-direction)
1003         (head-direction . ,LEFT)
1004         (stencil  . ,laissez-vibrer::print)
1005         (thickness . 1.0)
1006         (extra-spacing-height . (-0.5 . 0.5))
1007         (meta . ((class . Item)
1008                  (interfaces . (semi-tie-interface))))))
1009
1010     (LaissezVibrerTieColumn
1011      . (
1012         (head-direction . ,ly:semi-tie-column::calc-head-direction)
1013         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
1014         (X-extent . #f)
1015         (Y-extent . #f)
1016         (meta . ((class . Item)
1017                  (interfaces . (semi-tie-column-interface))))))
1018
1019     (LedgerLineSpanner
1020      . (
1021         (layer . 0)
1022         (length-fraction . 0.25)
1023         (minimum-length-fraction . 0.25)
1024         (springs-and-rods . ,ly:ledger-line-spanner::set-spacing-rods)
1025         (stencil . ,ly:ledger-line-spanner::print)
1026         (X-extent . #f)
1027         (Y-extent . #f)
1028         (meta . ((class . Spanner)
1029                  (interfaces . (ledger-line-spanner-interface))))))
1030
1031     (LeftEdge
1032      . (
1033         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
1034         (break-align-symbol . left-edge)
1035         (break-visibility . ,center-invisible)
1036         (non-musical . #t)
1037         (space-alist . (
1038                         (custos . (extra-space . 0.0))
1039                         (ambitus . (extra-space . 2.0))
1040                         (time-signature . (extra-space . 1.0))
1041                         (staff-bar . (extra-space . 0.0))
1042                         (breathing-sign . (minimum-space . 0.0))
1043                         (clef . (extra-space . 0.8))
1044                         (first-note . (fixed-space . 2.0))
1045                         (right-edge . (extra-space . 0.0))
1046                         (key-signature . (extra-space . 0.8))
1047                         (key-cancellation . (extra-space . 0.0))
1048                         ))
1049         (X-extent . (0 . 0))
1050         (meta . ((class . Item)
1051                  (interfaces . (break-aligned-interface))))))
1052
1053     (LigatureBracket
1054      . (
1055         ;; ugh.  A ligature bracket is totally different from
1056         ;; a tuplet bracket.
1057
1058         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
1059         (control-points . ,ly:tuplet-bracket::calc-control-points)
1060         (direction . ,UP)
1061         (edge-height . (0.7 . 0.7))
1062         (padding . 2.0)
1063         (positions . ,ly:tuplet-bracket::calc-positions)
1064         (shorten-pair . (-0.2 . -0.2))
1065         (staff-padding . 0.25)
1066         (stencil . ,ly:tuplet-bracket::print)
1067         (thickness . 1.6)
1068         (meta . ((class . Spanner)
1069                  (interfaces . (line-interface
1070                                 tuplet-bracket-interface))))))
1071
1072     (LyricExtender
1073      . (
1074         (minimum-length . 1.5)
1075         (stencil . ,ly:lyric-extender::print)
1076         (thickness . 0.8) ; line-thickness
1077         (Y-extent . (0 . 0))
1078         (meta . ((class . Spanner)
1079                  (interfaces . (lyric-extender-interface
1080                                 lyric-interface))))))
1081
1082     (LyricHyphen
1083      . (
1084         (dash-period . 10.0)
1085         (height . 0.42)
1086         (length . 0.66)
1087         (minimum-distance . 0.1)
1088         (minimum-length . 0.3)
1089         (padding . 0.07)
1090         (springs-and-rods . ,ly:lyric-hyphen::set-spacing-rods)
1091         (stencil . ,ly:lyric-hyphen::print)
1092         (thickness . 1.3)
1093         (Y-extent . (0 . 0))
1094         (meta . ((class . Spanner)
1095                  (interfaces . (font-interface
1096                                 lyric-hyphen-interface
1097                                 lyric-interface
1098                                 spanner-interface))))))
1099
1100     (LyricSpace
1101      . (
1102         (minimum-distance . 0.45)
1103         (padding . 0.0)
1104         (springs-and-rods . ,ly:lyric-hyphen::set-spacing-rods)
1105         (X-extent . #f)
1106         (Y-extent . #f)
1107         (meta . ((class . Spanner)
1108                  (interfaces . (lyric-hyphen-interface
1109                                 spanner-interface))))))
1110
1111     (LyricText
1112      . (
1113         (extra-spacing-width . (0.0 . 0.0))
1114         (font-series . bold-narrow)
1115         (font-size . 1.0)
1116         (self-alignment-X . ,CENTER)
1117         (stencil . ,lyric-text::print)
1118         (text . ,(grob::calc-property-by-copy 'text))
1119         (word-space . 0.6)
1120         (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent)
1121         (meta . ((class . Item)
1122                  (interfaces . (font-interface
1123                                 lyric-syllable-interface
1124                                 rhythmic-grob-interface
1125                                 self-alignment-interface
1126                                 text-interface))))))
1127
1128
1129     (MeasureGrouping
1130      . (
1131         (direction . ,UP)
1132         (height . 2.0)
1133         (padding . 2)
1134         (side-axis . ,Y)
1135         (staff-padding . 3)
1136         (stencil . ,ly:measure-grouping::print)
1137         (thickness . 1)
1138         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1139         (meta . ((class . Spanner)
1140                  (interfaces . (measure-grouping-interface
1141                                 side-position-interface))))))
1142
1143     (MelodyItem
1144      . (
1145         (neutral-direction . ,DOWN)
1146         (meta . ((class . Item)
1147                  (interfaces . (melody-spanner-interface))))))
1148
1149     (MensuralLigature
1150      . (
1151         (flexa-width . 2.0)
1152         (stencil . ,ly:mensural-ligature::print)
1153         (thickness . 1.4)
1154         (meta . ((class . Spanner)
1155                  (interfaces . (font-interface
1156                                 mensural-ligature-interface))))))
1157
1158     (MetronomeMark
1159      . (
1160         (after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
1161         (break-visibility . ,end-of-line-invisible)
1162         (direction . ,UP)
1163         (extra-spacing-width . (+inf.0 . -inf.0))
1164         (outside-staff-priority . 1000)
1165         (padding . 0.8)
1166         (side-axis . ,Y)
1167         (stencil . ,ly:text-interface::print)
1168         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1169         (X-offset . ,(ly:make-simple-closure
1170                       `(,+
1171                         ,(ly:make-simple-closure
1172                           (list ly:break-alignable-interface::self-align-callback))
1173                         ,(ly:make-simple-closure
1174                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1175         (self-alignment-X . ,LEFT)
1176         (break-align-symbol . metronome-mark)
1177         (break-align-symbols . (key-signature time-signature metronome-mark))
1178         (non-break-align-symbols . (MultiMeasureRest))
1179         (meta . ((class . Item)
1180                  (interfaces . (font-interface
1181                                 metronome-mark-interface
1182                                 side-position-interface
1183                                 break-alignable-interface
1184                                 text-interface))))))
1185
1186     (MultiMeasureRest
1187      . (
1188         (expand-limit . 10)
1189         (hair-thickness . 2.0)
1190         (padding . 1)
1191         (spacing-pair . (break-alignment . staff-bar))
1192         (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
1193         (staff-position . 0)
1194         (stencil . ,ly:multi-measure-rest::print)
1195         (thick-thickness . 6.6)
1196         (Y-offset . ,ly:staff-symbol-referencer::callback)
1197         (meta . ((class . Spanner)
1198                  (interfaces . (font-interface
1199                                 multi-measure-interface
1200                                 multi-measure-rest-interface
1201                                 rest-interface
1202                                 staff-symbol-referencer-interface))))))
1203
1204     (MultiMeasureRestNumber
1205      . (
1206         (bound-padding  . 2.0)
1207         (direction . ,UP)
1208         (font-encoding . fetaText)
1209         (padding . 0.4)
1210         (self-alignment-X . ,CENTER)
1211         (side-axis . ,Y)
1212         (springs-and-rods . ,ly:multi-measure-rest::set-text-rods)
1213         (staff-padding . 0.4)
1214         (stencil . ,ly:text-interface::print)
1215         (X-offset . ,(ly:make-simple-closure
1216                       `(,+
1217                         ,(ly:make-simple-closure
1218                           (list ly:self-alignment-interface::x-aligned-on-self))
1219                         ,(ly:make-simple-closure
1220                           (list ly:self-alignment-interface::x-centered-on-y-parent)))))
1221         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1222         (meta . ((class . Spanner)
1223                  (interfaces . (font-interface
1224                                 multi-measure-interface
1225                                 self-alignment-interface
1226                                 side-position-interface
1227                                 text-interface))))))
1228
1229     (MultiMeasureRestText
1230      . (
1231         (direction . ,UP)
1232         (outside-staff-priority . 450)
1233         (padding . 0.2)
1234         (self-alignment-X . ,CENTER)
1235         (staff-padding . 0.25)
1236         (stencil . ,ly:text-interface::print)
1237         (X-offset . ,(ly:make-simple-closure
1238                       `(,+
1239                         ,(ly:make-simple-closure
1240                           (list ly:self-alignment-interface::x-centered-on-y-parent))
1241                         ,(ly:make-simple-closure
1242                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1243         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1244         (meta . ((class . Spanner)
1245                  (interfaces . (font-interface
1246                                 multi-measure-interface
1247                                 self-alignment-interface
1248                                 side-position-interface
1249                                 text-interface))))))
1250
1251
1252     (NonMusicalPaperColumn
1253      . (
1254         (allow-loose-spacing . #t)
1255         (axes . (,X))
1256         (before-line-breaking . ,ly:paper-column::before-line-breaking)
1257         (full-measure-extra-space . 1.0)
1258         (horizontal-skylines . ,ly:separation-item::calc-skylines)
1259         ;;                    (stencil . ,ly:paper-column::print)
1260
1261         (line-break-permission . allow)
1262         (non-musical . #t)
1263         (page-break-permission . allow)
1264
1265         ;; debugging stuff: print column number.
1266         ;;               (font-size . -6) (font-name . "sans")  (Y-extent . #f)
1267
1268         (X-extent . ,ly:axis-group-interface::width)
1269         (meta . ((class . Paper_column)
1270                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1271                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1272                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1273                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1274                  (interfaces . (axis-group-interface
1275                                 font-interface
1276                                 paper-column-interface
1277                                 separation-item-interface
1278                                 spaceable-grob-interface))))))
1279
1280     (NoteCollision
1281      . (
1282         (axes . (,X ,Y))
1283         (positioning-done . ,ly:note-collision-interface::calc-positioning-done)
1284         (prefer-dotted-right . #t)
1285         (X-extent . ,ly:axis-group-interface::width)
1286         (Y-extent . ,ly:axis-group-interface::height)
1287         (meta . ((class . Item)
1288                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1289                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1290                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1291                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1292                  (interfaces . (axis-group-interface
1293                                 note-collision-interface))))))
1294
1295     (NoteColumn
1296      . (
1297         (axes . (,X ,Y))
1298         (horizontal-skylines . ,ly:separation-item::calc-skylines)
1299         (X-extent . ,ly:axis-group-interface::width)
1300         (Y-extent . ,ly:axis-group-interface::height)
1301         (meta . ((class . Item)
1302                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1303                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1304                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1305                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1306                  (interfaces . (axis-group-interface
1307                                 note-column-interface
1308                                 separation-item-interface))))))
1309
1310     (NoteHead
1311      . (
1312         (duration-log . ,note-head::calc-duration-log)
1313         (extra-spacing-height . ,ly:note-head::include-ledger-line-height)
1314         (glyph-name . ,note-head::calc-glyph-name)
1315         (stem-attachment . ,ly:note-head::calc-stem-attachment)
1316         (stencil . ,ly:note-head::print)
1317         (X-offset . ,ly:note-head::stem-x-shift)
1318         (Y-offset . ,ly:staff-symbol-referencer::callback)
1319         (meta . ((class . Item)
1320                  (interfaces . (font-interface
1321                                 gregorian-ligature-interface
1322                                 ledgered-interface
1323                                 mensural-ligature-interface
1324                                 note-head-interface
1325                                 rhythmic-grob-interface
1326                                 rhythmic-head-interface
1327                                 staff-symbol-referencer-interface
1328                                 vaticana-ligature-interface))))))
1329
1330     (NoteName
1331      . (
1332         (stencil . ,ly:text-interface::print)
1333         (meta . ((class . Item)
1334                  (interfaces . (font-interface
1335                                 note-name-interface
1336                                 text-interface))))))
1337
1338     (NoteSpacing
1339      . (
1340         ;; Changed this from 0.75.
1341         ;; If you ever change this back, please document! --hwn
1342         (knee-spacing-correction . 1.0)
1343         (same-direction-correction . 0.25)
1344         (space-to-barline . #t)
1345         (stem-spacing-correction . 0.5)
1346         (meta . ((class . Item)
1347                  (interfaces . (note-spacing-interface
1348                                 spacing-interface))))))
1349
1350
1351     (OctavateEight
1352      . (
1353         (break-visibility . ,begin-of-line-visible)
1354         (font-shape . italic)
1355         (font-size . -4)
1356         (self-alignment-X . ,CENTER)
1357         (staff-padding . 0.2)
1358         (stencil . ,ly:text-interface::print)
1359         (X-offset . ,(ly:make-simple-closure
1360                       `(,+
1361                         ,(ly:make-simple-closure
1362                           (list ly:self-alignment-interface::x-aligned-on-self))
1363                         ,(ly:make-simple-closure
1364                           (list ly:self-alignment-interface::centered-on-x-parent)))))
1365         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1366         (meta . ((class . Item)
1367                  (interfaces . (font-interface
1368                                 self-alignment-interface
1369                                 side-position-interface
1370                                 text-interface))))))
1371
1372     (OttavaBracket
1373      . (
1374         (dash-fraction . 0.3)
1375         (direction . ,UP)
1376         (edge-height . (0 . 1.2))
1377         (font-shape . italic)
1378         (minimum-length . 1.0)
1379         (outside-staff-priority . 400)
1380         (padding . 0.5)
1381         (shorten-pair . (0.0 . -0.6))
1382         (staff-padding . 1.0)
1383         (stencil . ,ly:ottava-bracket::print)
1384         (style . dashed-line)
1385         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1386         (meta . ((class . Spanner)
1387                  (interfaces . (font-interface
1388                                 horizontal-bracket-interface
1389                                 line-interface
1390                                 ottava-bracket-interface
1391                                 side-position-interface
1392                                 text-interface))))))
1393
1394
1395     (PaperColumn
1396      . (
1397         (allow-loose-spacing . #t)
1398         (axes . (,X))
1399         (before-line-breaking . ,ly:paper-column::before-line-breaking)
1400         (horizontal-skylines . ,ly:separation-item::calc-skylines)
1401         ;; (stencil . ,ly:paper-column::print)
1402         (X-extent . ,ly:axis-group-interface::width)
1403
1404         ;; debugging
1405         ;;                       (font-size . -6) (font-name . "sans") (Y-extent . #f)
1406         (meta . ((class . Paper_column)
1407                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1408                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1409                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1410                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1411                  (interfaces . (axis-group-interface
1412                                 font-interface
1413                                 paper-column-interface
1414                                 separation-item-interface
1415                                 spaceable-grob-interface))))))
1416
1417     (ParenthesesItem
1418      . (
1419         (font-size . -6)
1420         (padding . 0.2)
1421         (stencil . ,parentheses-item::print)
1422         (stencils . ,parentheses-item::calc-parenthesis-stencils)
1423         (meta . ((class . Item)
1424                  (interfaces . (font-interface
1425                                 parentheses-interface))))))
1426
1427     (PercentRepeat
1428      . (
1429         (dot-negative-kern . 0.75)
1430         (font-encoding . fetaMusic)
1431         (slope . 1.0)
1432         (spacing-pair . (break-alignment . staff-bar))
1433         (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
1434         (stencil . ,ly:multi-measure-rest::percent)
1435         (thickness . 0.48)
1436         (meta . ((class . Spanner)
1437                  (interfaces . (font-interface
1438                                 multi-measure-rest-interface
1439                                 percent-repeat-interface))))))
1440
1441     (PercentRepeatCounter
1442      . (
1443         (direction . ,UP)
1444         (font-encoding . fetaText)
1445         (font-size . -2)
1446         (padding . 0.2)
1447         (self-alignment-X . ,CENTER)
1448         (staff-padding . 0.25)
1449         (stencil . ,ly:text-interface::print)
1450         (X-offset . ,(ly:make-simple-closure
1451                       `(,+
1452                         ,(ly:make-simple-closure
1453                           (list ly:self-alignment-interface::x-centered-on-y-parent))
1454                         ,(ly:make-simple-closure
1455                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1456         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1457         (meta . ((class . Spanner)
1458                  (interfaces . (font-interface
1459                                 percent-repeat-interface
1460                                 self-alignment-interface
1461                                 side-position-interface
1462                                 text-interface))))))
1463
1464     (PhrasingSlur
1465      . (
1466         (control-points . ,ly:slur::calc-control-points)
1467         (cross-staff . ,ly:slur::calc-cross-staff)
1468         (details . ,default-slur-details)
1469         (direction . ,ly:slur::calc-direction)
1470         (height-limit . 2.0)
1471         (minimum-length . 1.5)
1472         (ratio . 0.333)
1473         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1474         (stencil . ,ly:slur::print)
1475         (thickness . 1.1)
1476         (Y-extent . ,ly:slur::height)
1477         (meta . ((class . Spanner)
1478                  (interfaces . (slur-interface))))))
1479
1480     ;; an example of a text spanner
1481     (PianoPedalBracket
1482      . (
1483         (bound-padding . 1.0)
1484         (bracket-flare . (0.5 . 0.5))
1485         (direction . ,DOWN)
1486         (edge-height . (1.0 . 1.0))
1487         (shorten-pair . (0.0 . 0.0))
1488         (stencil . ,ly:piano-pedal-bracket::print)
1489         (style . line)
1490         (thickness .  1.0)
1491         (meta . ((class . Spanner)
1492                  (interfaces . (line-interface
1493                                 piano-pedal-bracket-interface
1494                                 piano-pedal-interface))))))
1495
1496
1497     (RehearsalMark
1498      . (
1499         (after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
1500         (baseline-skip . 2)
1501         (break-align-symbols . (staff-bar clef))
1502         (break-visibility . ,end-of-line-invisible)
1503         (direction . ,UP)
1504         (extra-spacing-width . (+inf.0 . -inf.0))
1505         (font-size . 2)
1506         (non-musical . #t)
1507         (outside-staff-priority . 1500)
1508         (padding . 0.8)
1509         (self-alignment-X . ,CENTER)
1510         (stencil . ,ly:text-interface::print)
1511         (X-offset . ,(ly:make-simple-closure
1512                       `(,+
1513                         ,(ly:make-simple-closure
1514                           (list ly:break-alignable-interface::self-align-callback))
1515                         ,(ly:make-simple-closure
1516                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1517         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1518         (meta . ((class . Item)
1519                  (interfaces . (break-alignable-interface
1520                                 font-interface
1521                                 mark-interface
1522                                 self-alignment-interface
1523                                 side-position-interface
1524                                 text-interface))))))
1525
1526     (RepeatSlash
1527      . (
1528         (slope . 1.7)
1529         (stencil . ,ly:percent-repeat-item-interface::beat-slash)
1530         (thickness . 0.48)
1531         (meta . ((class . Item)
1532                  (interfaces . (percent-repeat-interface
1533                                 percent-repeat-item-interface
1534                                 rhythmic-grob-interface))))))
1535
1536     (RepeatTie
1537      . (
1538         (control-points . ,ly:semi-tie::calc-control-points)
1539         (details . ((ratio . 0.333)
1540                     (height-limit . 1.0)))
1541         (direction . ,ly:tie::calc-direction)
1542         (head-direction . ,RIGHT)
1543         (stencil  . ,ly:tie::print)
1544         (thickness . 1.0)
1545         (extra-spacing-height . (-0.5 . 0.5))
1546         (meta . ((class . Item)
1547                  (interfaces . (semi-tie-interface))))))
1548
1549     (RepeatTieColumn
1550      . (
1551         (direction . ,ly:tie::calc-direction)
1552         (head-direction . ,ly:semi-tie-column::calc-head-direction)
1553         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
1554         (X-extent . #f)
1555         (Y-extent . #f)
1556         (meta . ((class . Item)
1557                  (interfaces . (semi-tie-column-interface))))))
1558
1559     (Rest
1560      . (
1561         (cross-staff . ,ly:rest::calc-cross-staff)
1562         (duration-log . ,stem::calc-duration-log)
1563         (minimum-distance . 0.25)
1564         (stencil . ,ly:rest::print)
1565         (X-extent . ,ly:rest::width)
1566         (Y-extent . ,ly:rest::height)
1567         (Y-offset . ,ly:rest::y-offset-callback)
1568         (meta . ((class . Item)
1569                  (interfaces . (font-interface
1570                                 rest-interface
1571                                 rhythmic-grob-interface
1572                                 rhythmic-head-interface
1573                                 staff-symbol-referencer-interface))))))
1574
1575     (RestCollision
1576      . (
1577         (minimum-distance . 0.75)
1578         (positioning-done . ,ly:rest-collision::calc-positioning-done)
1579         (meta . ((class . Item)
1580                  (interfaces . (rest-collision-interface))))))
1581
1582
1583     (Script
1584      . (
1585         (add-stem-support . #t)
1586         (cross-staff . ,ly:script-interface::calc-cross-staff)
1587         (direction . ,ly:script-interface::calc-direction)
1588         (font-encoding . fetaMusic)
1589         (positioning-done . ,ly:script-interface::calc-positioning-done)
1590         (side-axis . ,Y)
1591
1592         ;; padding set in script definitions.
1593         (staff-padding . 0.25)
1594
1595         (stencil . ,ly:script-interface::print)
1596         (X-offset . ,script-interface::calc-x-offset)
1597         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1598         (meta . ((class . Item)
1599                  (interfaces . (font-interface
1600                                 script-interface
1601                                 side-position-interface))))))
1602
1603     (ScriptColumn
1604      . (
1605         (before-line-breaking . ,ly:script-column::before-line-breaking)
1606         (meta . ((class . Item)
1607                  (interfaces . (script-column-interface))))))
1608
1609     (ScriptRow
1610      . (
1611         (before-line-breaking . ,ly:script-column::row-before-line-breaking)
1612         (meta . ((class . Item)
1613                  (interfaces . (script-column-interface))))))
1614
1615     (Slur
1616      . (
1617         (avoid-slur . inside)
1618         (control-points . ,ly:slur::calc-control-points)
1619         (cross-staff . ,ly:slur::calc-cross-staff)
1620         (details . ,default-slur-details)
1621         (direction . ,ly:slur::calc-direction)
1622         (height-limit . 2.0)
1623         (line-thickness . 0.8)
1624         (minimum-length . 1.5)
1625         (ratio . 0.25)
1626         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1627         (stencil . ,ly:slur::print)
1628         (thickness . 1.2)
1629         (Y-extent . ,ly:slur::height)
1630         (meta . ((class . Spanner)
1631                  (interfaces . (slur-interface))))))
1632
1633     (SostenutoPedal
1634      . (
1635         (direction . ,RIGHT)
1636         (extra-spacing-width . (+inf.0 . -inf.0))
1637         (font-shape . italic)
1638         (padding . 0.0) ;; padding relative to SostenutoPedalLineSpanner
1639         (self-alignment-X . ,CENTER)
1640         (stencil . ,ly:text-interface::print)
1641         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1642         (meta . ((class . Item)
1643                  (interfaces . (font-interface
1644                                 piano-pedal-script-interface
1645                                 self-alignment-interface
1646                                 text-interface))))))
1647
1648     (SostenutoPedalLineSpanner
1649      . (
1650         (axes . (,Y))
1651         (direction . ,DOWN)
1652         (minimum-space . 1.0)
1653         (outside-staff-priority . 1000)
1654         (padding . 1.2)
1655         (side-axis . ,Y)
1656         (staff-padding . 1.0)
1657         (X-extent . ,ly:axis-group-interface::width)
1658         (Y-extent . ,ly:axis-group-interface::height)
1659         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1660         (meta . ((class . Spanner)
1661                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1662                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1663                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1664                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1665                  (interfaces . (axis-group-interface
1666                                 piano-pedal-interface
1667                                 side-position-interface))))))
1668
1669     (SpacingSpanner
1670      . (
1671         (average-spacing-wishes . #t)
1672         (base-shortest-duration . ,(ly:make-moment 3 16))
1673         (common-shortest-duration . ,ly:spacing-spanner::calc-common-shortest-duration)
1674         (shortest-duration-space . 2.0)
1675         (spacing-increment . 1.2)
1676         (springs-and-rods . ,ly:spacing-spanner::set-springs)
1677         (meta . ((class . Spanner)
1678                  (interfaces . (spacing-options-interface
1679                                 spacing-spanner-interface))))))
1680
1681     (SpanBar
1682      . (
1683         (allow-span-bar . #t)
1684         (bar-extent . ,ly:axis-group-interface::height)
1685         (bar-size . ,ly:span-bar::calc-bar-size)
1686         (before-line-breaking . ,ly:span-bar::before-line-breaking)
1687         (break-align-symbol . staff-bar)
1688         (cross-staff . #t)
1689         (glyph-name . ,ly:span-bar::calc-glyph-name)
1690
1691         ;; ugh duplication! (these 4 properties were copied from Barline)
1692         ;;
1693         ;; Ross. page 151 lists other values, we opt for a leaner look
1694         ;;
1695         (kern . 3.0)
1696         (thin-kern . 3.0)
1697         (hair-thickness . 1.6)
1698         (thick-thickness . 6.0)
1699
1700         (layer . 0)
1701         (non-musical . #t)
1702         (stencil . ,ly:span-bar::print)
1703         (X-extent . ,ly:span-bar::width)
1704         (Y-extent . ,ly:axis-group-interface::height)
1705         (meta . ((class . Item)
1706                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1707                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1708                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1709                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1710                  (interfaces . (bar-line-interface
1711                                 font-interface
1712                                 span-bar-interface))))))
1713
1714     (StaffGrouper
1715      . (
1716         (between-staff-spacing . ((space . 9)
1717                                   (minimum-distance . 7)
1718                                   (padding . 1)))
1719         (after-last-staff-spacing . ((space . 10.5)
1720                                      (minimum-distance . 8)
1721                                      (padding . 1)))
1722         (meta . ((class . Spanner)
1723                  (interfaces . (staff-grouper-interface))))))
1724
1725     (StaffSpacing
1726      . (
1727         (non-musical . #t)
1728         (stem-spacing-correction . 0.4)
1729         (meta . ((class . Item)
1730                  (interfaces . (spacing-interface
1731                                 staff-spacing-interface))))))
1732
1733     (StaffSymbol
1734      . (
1735         (layer . 0)
1736         (ledger-line-thickness . (1.0 . 0.1))
1737         (line-count . 5)
1738         (stencil . ,ly:staff-symbol::print)
1739         (Y-extent . ,ly:staff-symbol::height)
1740         (meta . ((class . Spanner)
1741                  (interfaces . (staff-symbol-interface))))))
1742
1743     (StanzaNumber
1744      . (
1745         (direction . ,LEFT)
1746         (font-series . bold)
1747         (padding . 1.0)
1748         (side-axis . ,X)
1749         (stencil . ,ly:text-interface::print)
1750         (X-offset . ,ly:side-position-interface::x-aligned-side)
1751         (meta . ((class . Item)
1752                  (interfaces . (font-interface
1753                                 side-position-interface
1754                                 stanza-number-interface
1755                                 text-interface))))))
1756
1757     (Stem
1758      . (
1759         (beamlet-default-length . (1.1 . 1.1))
1760         (beamlet-max-length-proportion . (0.75 . 0.75))
1761         (cross-staff . ,ly:stem::calc-cross-staff)
1762         (default-direction . ,ly:stem::calc-default-direction)
1763         (details
1764          . (
1765             ;; 3.5 (or 3 measured from note head) is standard length
1766             ;; 32nd, 64th, 128th flagged stems should be longer
1767             (lengths . (3.5 3.5 3.5 4.5 5.0 6.0))
1768
1769             ;; FIXME.  3.5 yields too long beams (according to Ross and
1770             ;; looking at Baerenreiter examples) for a number of common
1771             ;; boundary cases.  Subtracting half a beam thickness fixes
1772             ;; this, but the bug may well be somewhere else.
1773
1774             ;; FIXME this should come from 'lengths
1775             (beamed-lengths . (3.26 3.5 3.6))
1776
1777             ;; The 'normal' minima
1778             (beamed-minimum-free-lengths . (1.83 1.5 1.25))
1779                                         ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
1780
1781             ;; The 'extreme case' minima
1782             (beamed-extreme-minimum-free-lengths . (2.0 1.25))
1783
1784             ;; Stems in unnatural (forced) direction should be shortened by
1785             ;; one staff space, according to [Roush & Gourlay].
1786             ;; Flagged stems we shorten only half a staff space.
1787             (stem-shorten . (1.0 0.5))
1788
1789             ))
1790
1791         ;; We use the normal minima as minimum for the ideal lengths,
1792         ;; and the extreme minima as abolute minimum length.
1793
1794         (direction . ,ly:stem::calc-direction)
1795         (duration-log . ,stem::calc-duration-log)
1796         (flag . ,ly:stem::calc-flag)
1797         (length . ,ly:stem::calc-length)
1798         (neutral-direction . ,DOWN)
1799         (positioning-done . ,ly:stem::calc-positioning-done)
1800         (stem-end-position . ,ly:stem::calc-stem-end-position)
1801         (stem-info . ,ly:stem::calc-stem-info)
1802         (stencil . ,ly:stem::print)
1803         (thickness . 1.3)
1804         (X-extent . ,ly:stem::width)
1805         (X-offset . ,ly:stem::offset-callback)
1806         (Y-extent . ,ly:stem::height)
1807         (Y-offset . ,ly:staff-symbol-referencer::callback)
1808         (meta . ((class . Item)
1809                  (interfaces . (font-interface
1810                                 stem-interface))))))
1811
1812     (StemTremolo
1813      . (
1814         (beam-thickness . 0.48) ; staff-space
1815         (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space
1816         (slope . ,ly:stem-tremolo::calc-slope)
1817         (stencil . ,ly:stem-tremolo::print)
1818         (style . ,ly:stem-tremolo::calc-style)
1819         (X-extent . ,ly:stem-tremolo::width)
1820         (Y-extent . ,ly:stem-tremolo::height)
1821         (meta . ((class . Item)
1822                  (interfaces . (stem-tremolo-interface))))))
1823
1824     (StringNumber
1825      . (
1826         (avoid-slur . around)
1827         (font-encoding . fetaText)
1828         (font-size . -5)                ; don't overlap when next to heads.
1829         (padding . 0.5)
1830         (script-priority . 100)
1831         (self-alignment-X . ,CENTER)
1832         (self-alignment-Y . ,CENTER)
1833         (staff-padding . 0.5)
1834         (stencil . ,print-circled-text-callback)
1835         (text . ,string-number::calc-text)
1836         (meta . ((class . Item)
1837                  (interfaces . (font-interface
1838                                 self-alignment-interface
1839                                 side-position-interface
1840                                 string-number-interface
1841                                 text-interface
1842                                 text-script-interface))))))
1843
1844     (StrokeFinger
1845      . (
1846         (digit-names . #("p" "i" "m" "a" "x"))
1847         (font-shape . italic)
1848         (font-size . -4)                ; don't overlap when next to heads.
1849         (padding . 0.5)
1850         (script-priority . 100)
1851         (self-alignment-X . ,CENTER)
1852         (self-alignment-Y . ,CENTER)
1853         (staff-padding . 0.5)
1854         (stencil . ,ly:text-interface::print)
1855         (text . ,stroke-finger::calc-text)
1856         (meta . ((class . Item)
1857                  (interfaces . (font-interface
1858                                 self-alignment-interface
1859                                 side-position-interface
1860                                 stroke-finger-interface
1861                                 text-interface
1862                                 text-script-interface))))))
1863
1864     (SustainPedal
1865      . (
1866         (direction . ,RIGHT)
1867         (extra-spacing-width . (+inf.0 . -inf.0))
1868         (padding . 0.0)  ;; padding relative to SustainPedalLineSpanner
1869         (self-alignment-X . ,CENTER)
1870         (stencil . ,ly:sustain-pedal::print)
1871         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1872         (meta . ((class . Item)
1873                  (interfaces . (font-interface
1874                                 piano-pedal-interface
1875                                 piano-pedal-script-interface
1876                                 self-alignment-interface
1877                                 text-interface))))))
1878
1879     (SustainPedalLineSpanner
1880      . (
1881         (axes . (,Y))
1882         (direction . ,DOWN)
1883         (minimum-space . 1.0)
1884         (outside-staff-priority . 1000)
1885         (padding . 1.2)
1886         (side-axis . ,Y)
1887         (staff-padding . 1.2)
1888         (X-extent . ,ly:axis-group-interface::width)
1889         (Y-extent . ,ly:axis-group-interface::height)
1890         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1891         (meta . ((class . Spanner)
1892                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1893                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
1894                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1895                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
1896                  (interfaces . (axis-group-interface
1897                                 piano-pedal-interface
1898                                 side-position-interface))))))
1899
1900     (System
1901      . (
1902         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
1903         (axes . (,X ,Y))
1904         (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
1905         (X-extent . ,ly:axis-group-interface::width)
1906         (Y-extent . ,ly:system::height)
1907         (meta . ((class . System)
1908                  (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
1909                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
1910                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
1911                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
1912                  (interfaces . (axis-group-interface
1913                                 system-interface))))))
1914
1915     (SystemStartBar
1916      . (
1917         (collapse-height . 5.0)
1918         (direction . ,LEFT)
1919
1920         ;; ugh--hardcoded.
1921         (padding . -0.1)  ;; bar must cover rounded ending of staff line.
1922         (stencil . ,ly:system-start-delimiter::print)
1923         (style . bar-line)
1924         (thickness . 1.6)
1925         (X-offset . ,ly:side-position-interface::x-aligned-side)
1926         (Y-extent . #f)
1927         (meta . ((class . Spanner)
1928                  (interfaces . (side-position-interface
1929                                 system-start-delimiter-interface))))))
1930
1931     (SystemStartBrace
1932      . (
1933         (collapse-height . 5.0)
1934         (direction . ,LEFT)
1935         (font-encoding . fetaBraces)
1936         (padding . 0.3)
1937         (stencil . ,ly:system-start-delimiter::print)
1938         (style . brace)
1939         (X-offset . ,ly:side-position-interface::x-aligned-side)
1940         (Y-extent . #f)
1941         (meta . ((class . Spanner)
1942                  (interfaces . (font-interface
1943                                 side-position-interface
1944                                 system-start-delimiter-interface))))))
1945
1946     (SystemStartBracket
1947      . (
1948         (collapse-height . 5.0)
1949         (direction . ,LEFT)
1950         (padding . 0.8)
1951         (stencil . ,ly:system-start-delimiter::print)
1952         (style . bracket)
1953         (thickness . 0.45)
1954         (X-offset . ,ly:side-position-interface::x-aligned-side)
1955         (Y-extent . #f)
1956         (meta . ((class . Spanner)
1957                  (interfaces . (font-interface
1958                                 side-position-interface
1959                                 system-start-delimiter-interface))))))
1960
1961     (SystemStartSquare
1962      . (
1963         (direction . ,LEFT)
1964         (stencil . ,ly:system-start-delimiter::print)
1965         (style . line-bracket)
1966         (thickness . 1.0)
1967         (X-offset . ,ly:side-position-interface::x-aligned-side)
1968         (Y-extent . #f)
1969         (meta . ((class . Spanner)
1970                  (interfaces . (font-interface
1971                                 side-position-interface
1972                                 system-start-delimiter-interface))))))
1973
1974
1975     (TabNoteHead
1976      . (
1977         (details . ((tied-properties . ((break-visibility . ,begin-of-line-visible)
1978                                         (parenthesize . #t)))
1979                     (repeat-tied-properties . ((note-head-visible . #t)
1980                                                (parenthesize . #t)))))
1981         (direction . ,CENTER)
1982         (duration-log . ,note-head::calc-duration-log)
1983         (font-series . bold)
1984         (font-size . -2)
1985         (stem-attachment . (0.0 . 1.35))
1986         (stencil . ,ly:text-interface::print)
1987         (whiteout . #t)
1988         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1989         (Y-offset . ,ly:staff-symbol-referencer::callback)
1990         (meta . ((class . Item)
1991                  (interfaces  . (font-interface
1992                                  note-head-interface
1993                                  rhythmic-grob-interface
1994                                  rhythmic-head-interface
1995                                  staff-symbol-referencer-interface
1996                                  tab-note-head-interface
1997                                  text-interface))))))
1998
1999     (TextScript
2000      . (
2001         (avoid-slur . around)
2002         (cross-staff . ,ly:script-interface::calc-cross-staff)
2003         (direction . ,DOWN)
2004         (direction . ,ly:script-interface::calc-direction)
2005         (extra-spacing-width . (+inf.0 . -inf.0))
2006         (outside-staff-priority . 450)
2007
2008         ;; sync with Fingering ?
2009         (padding . 0.5)
2010
2011         (positioning-done . ,ly:script-interface::calc-positioning-done)
2012         (script-priority . 200)
2013         (side-axis . ,Y)
2014         (slur-padding . 0.5)
2015         (staff-padding . 0.5)
2016         (stencil . ,ly:text-interface::print)
2017         ;; todo: add X self alignment?
2018         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2019         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2020         (meta . ((class . Item)
2021                  (interfaces . (font-interface
2022                                 instrument-specific-markup-interface
2023                                 self-alignment-interface
2024                                 side-position-interface
2025                                 text-interface
2026                                 text-script-interface))))))
2027
2028     (TextSpanner
2029      . (
2030         (bound-details . ((left . ((Y . 0)
2031                                    (padding . 0.25)
2032                                    (attach-dir . ,LEFT)
2033                                    ))
2034                           (left-broken . ((end-on-note . #t)))
2035                           (right . ((Y . 0)
2036                                     (padding . 0.25)
2037                                     ))
2038                           ))
2039         (dash-fraction . 0.2)
2040         (dash-period . 3.0)
2041         (direction . ,UP)
2042         (font-shape . italic)
2043         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2044         (outside-staff-priority . 350)
2045         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2046         (side-axis . ,Y)
2047         (staff-padding . 0.8)
2048         (stencil . ,ly:line-spanner::print)
2049         (style . dashed-line)
2050         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2051
2052         (meta . ((class . Spanner)
2053                  (interfaces . (font-interface
2054                                 line-interface
2055                                 line-spanner-interface
2056                                 side-position-interface))))))
2057
2058     (Tie
2059      . (
2060         (avoid-slur . inside)
2061         (control-points . ,ly:tie::calc-control-points)
2062         (details . (
2063                     ;; for a full list, see tie-details.cc
2064                     (ratio . 0.333)
2065                     (center-staff-line-clearance . 0.6)
2066                     (tip-staff-line-clearance . 0.45)
2067                     (note-head-gap . 0.2)
2068                     (stem-gap . 0.35)
2069                     (height-limit . 1.0)
2070                     (horizontal-distance-penalty-factor . 10)
2071                     (same-dir-as-stem-penalty . 8)
2072                     (min-length-penalty-factor . 26)
2073                     (tie-tie-collision-distance . 0.45)
2074                     (tie-tie-collision-penalty . 25.0)
2075                     (intra-space-threshold . 1.25)
2076                     (outer-tie-vertical-distance-symmetry-penalty-factor . 10)
2077                     (outer-tie-length-symmetry-penalty-factor . 10)
2078                     (vertical-distance-penalty-factor . 7)
2079                     (outer-tie-vertical-gap . 0.25)
2080                     (multi-tie-region-size . 3)
2081                     (single-tie-region-size . 4)
2082                     (between-length-limit . 1.0)))
2083
2084         (direction . ,ly:tie::calc-direction)
2085         (font-size . -6)
2086         (line-thickness . 0.8)
2087         (neutral-direction . ,UP)
2088         (springs-and-rods . ,ly:spanner::set-spacing-rods)
2089         (stencil . ,ly:tie::print)
2090         (thickness . 1.2)
2091         (meta . ((class . Spanner)
2092                  (interfaces . (tie-interface))))))
2093
2094     (TieColumn
2095      . (
2096         (before-line-breaking . ,ly:tie-column::before-line-breaking)
2097         (positioning-done . ,ly:tie-column::calc-positioning-done)
2098         (X-extent . #f)
2099         (Y-extent . #f)
2100         (meta . ((class . Spanner)
2101                  (interfaces . (tie-column-interface))))))
2102
2103     (TimeSignature
2104      . (
2105         (avoid-slur . inside)
2106         (break-align-anchor
2107          . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
2108         (break-align-symbol . time-signature)
2109         (break-align-anchor-alignment . ,LEFT)
2110         (break-visibility . ,all-visible)
2111         (extra-spacing-height . (-1.0 . 1.0))
2112         (non-musical . #t)
2113         (space-alist . (
2114                         (first-note . (fixed-space . 2.0))
2115                         (right-edge . (extra-space . 0.5))
2116                         (staff-bar . (minimum-space . 2.0))))
2117         (stencil . ,ly:time-signature::print)
2118         (style . C)
2119         (meta . ((class . Item)
2120                  (interfaces . (break-aligned-interface
2121                                 font-interface
2122                                 time-signature-interface))))))
2123
2124     (TrillPitchAccidental
2125      . (
2126         (direction . ,LEFT)
2127         (font-size . -4)
2128         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
2129         (padding . 0.2)
2130         (side-axis . ,X)
2131         (stencil . ,ly:accidental-interface::print)
2132         (X-offset . ,ly:side-position-interface::x-aligned-side)
2133         (Y-extent . ,ly:accidental-interface::height)
2134         (meta . ((class . Item)
2135                  (interfaces . (accidental-interface
2136                                 font-interface
2137                                 side-position-interface
2138                                 trill-pitch-accidental-interface))))))
2139
2140     (TrillPitchGroup
2141      . (
2142         (axes . (,X))
2143         (direction . ,RIGHT)
2144         (font-size . -4)
2145         (padding . 0.3)
2146         (side-axis . ,X)
2147         (stencil . ,parenthesize-elements)
2148         (stencils . ,parentheses-item::calc-parenthesis-stencils)
2149         (X-offset . ,ly:side-position-interface::x-aligned-side)
2150         (meta . ((class . Item)
2151                  (interfaces . (axis-group-interface
2152                                 font-interface
2153                                 note-head-interface
2154                                 parentheses-interface
2155                                 side-position-interface))))))
2156
2157     (TrillPitchHead
2158      . (
2159         (duration-log . 2)
2160         (font-size . -4)
2161         (stencil . ,ly:note-head::print)
2162         (Y-offset . ,ly:staff-symbol-referencer::callback)
2163         (meta . ((class . Item)
2164                  (interfaces . (font-interface
2165                                 ledgered-interface
2166                                 pitched-trill-interface
2167                                 rhythmic-head-interface
2168                                 staff-symbol-referencer-interface))))))
2169
2170     (TrillSpanner
2171      . (
2172         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
2173         (bound-details . ((left . ((text . ,(make-musicglyph-markup "scripts.trill"))
2174                                    (Y . 0)
2175                                    (stencil-offset . (-0.5 . -1))
2176                                    (padding . 0.5)
2177                                    (attach-dir . ,CENTER)
2178                                    ))
2179                           (left-broken . ((end-on-note . #t)))
2180                           (right . ((Y . 0)))
2181                           ))
2182         (direction . ,UP)
2183         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2184         (outside-staff-priority . 50)
2185         (padding . 0.5)
2186         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2187         (side-axis . ,Y)
2188         (staff-padding . 1.0)
2189         (stencil . ,ly:line-spanner::print)
2190         (style . trill)
2191         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2192         (meta . ((class . Spanner)
2193                  (interfaces . (font-interface
2194                                 line-interface
2195                                 line-spanner-interface
2196                                 side-position-interface
2197                                 trill-spanner-interface))))))
2198
2199     (TupletBracket
2200      . (
2201         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
2202         (control-points . ,ly:tuplet-bracket::calc-control-points)
2203         (cross-staff . ,ly:tuplet-bracket::calc-cross-staff)
2204         (direction  . ,ly:tuplet-bracket::calc-direction)
2205         (edge-height . (0.7 . 0.7))
2206         (full-length-to-extent . #t)
2207         (padding . 1.1)
2208         (positions . ,ly:tuplet-bracket::calc-positions)
2209         (shorten-pair . (-0.2 . -0.2))
2210         (staff-padding . 0.25)
2211         (stencil . ,ly:tuplet-bracket::print)
2212         (thickness . 1.6)
2213
2214         (meta . ((class . Spanner)
2215                  (interfaces . (line-interface
2216                                 tuplet-bracket-interface))))))
2217
2218     (TupletNumber
2219      . (
2220         (avoid-slur . inside)
2221         (cross-staff . ,ly:tuplet-number::calc-cross-staff)
2222         (font-shape . italic)
2223         (font-size . -2)
2224         (stencil . ,ly:tuplet-number::print)
2225         (text . ,tuplet-number::calc-denominator-text)
2226         (meta . ((class . Spanner)
2227                  (interfaces . (font-interface
2228                                 text-interface
2229                                 tuplet-number-interface))))))
2230
2231
2232     (UnaCordaPedal
2233      . (
2234         (direction . ,RIGHT)
2235         (extra-spacing-width . (+inf.0 . -inf.0))
2236         (font-shape . italic)
2237         (padding . 0.0)  ;; padding relative to UnaCordaPedalLineSpanner
2238         (self-alignment-X . ,CENTER)
2239         (stencil . ,ly:text-interface::print)
2240         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2241         (meta . ((class . Item)
2242                  (interfaces . (font-interface
2243                                 piano-pedal-script-interface
2244                                 self-alignment-interface
2245                                 text-interface))))))
2246
2247     (UnaCordaPedalLineSpanner
2248      . (
2249         (axes . (,Y))
2250         (direction . ,DOWN)
2251         (minimum-space . 1.0)
2252         (outside-staff-priority . 1000)
2253         (padding . 1.2)
2254         (side-axis . ,Y)
2255         (staff-padding . 1.2)
2256         (X-extent . ,ly:axis-group-interface::width)
2257         (Y-extent . ,ly:axis-group-interface::height)
2258         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2259         (meta . ((class . Spanner)
2260                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2261                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
2262                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
2263                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
2264                  (interfaces . (axis-group-interface
2265                                 piano-pedal-interface
2266                                 side-position-interface))))))
2267
2268
2269     (VaticanaLigature
2270      . (
2271         (flexa-width . 2.0)
2272         (stencil . ,ly:vaticana-ligature::print)
2273         (thickness . 0.6)
2274         (meta . ((class . Spanner)
2275                  (interfaces . (font-interface
2276                                 vaticana-ligature-interface))))))
2277
2278     (VerticalAlignment
2279      . (
2280         (axes . (,Y))
2281         (positioning-done . ,ly:align-interface::align-to-ideal-distances)
2282         (stacking-dir . -1)
2283         (vertical-skylines . ,ly:axis-group-interface::combine-skylines)
2284         (X-extent . ,ly:axis-group-interface::width)
2285         (Y-extent . ,ly:axis-group-interface::height)
2286         (meta . ((class . Spanner)
2287                  (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)
2288                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
2289                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
2290                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
2291                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
2292                  (interfaces . (align-interface
2293                                 axis-group-interface))))))
2294
2295     (VerticalAxisGroup
2296      . (
2297         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
2298         (axes . (,Y))
2299         (default-next-staff-spacing . ((space . 9)
2300                                        (minimum-distance . 8)
2301                                        (padding . 1)))
2302         (next-staff-spacing . ,ly:axis-group-interface::calc-next-staff-spacing)
2303         (non-affinity-spacing . ((padding . 0.5)))
2304         (stencil . ,ly:axis-group-interface::print)
2305         (vertical-skylines . ,ly:hara-kiri-group-spanner::calc-skylines)
2306         (X-extent . ,ly:axis-group-interface::width)
2307         (Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
2308         (Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
2309         (meta . ((class . Spanner)
2310                  (object-callbacks . (
2311                                       (X-common . ,ly:axis-group-interface::calc-x-common)
2312                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2313                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
2314                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
2315                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
2316
2317                  (interfaces . (axis-group-interface
2318                                 hara-kiri-group-spanner-interface))))))
2319
2320     (VoiceFollower
2321      . (
2322         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
2323         (bound-details . ((right . ((attach-dir .  ,CENTER)
2324                                     (padding . 1.5)
2325                                       ))
2326                           (left . ((attach-dir .  ,CENTER)
2327                                    (padding . 1.5)
2328                                       ))
2329                           ))
2330         (gap . 0.5)
2331         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2332         (non-musical . #t)
2333         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2334         (stencil . ,ly:line-spanner::print)
2335         (style . line)
2336         (X-extent . #f)
2337         (Y-extent . #f)
2338         (meta . ((class . Spanner)
2339                  (interfaces . (line-interface
2340                                 line-spanner-interface))))))
2341
2342     (VoltaBracket
2343      . (
2344         (direction . ,UP)
2345         (edge-height . (2.0 . 2.0)) ;; staff-space;
2346         (font-encoding . fetaText)
2347         (font-size . -4)
2348         (stencil . ,ly:volta-bracket-interface::print)
2349         (thickness . 1.6) ;; line-thickness
2350         (word-space . 0.6)
2351         (meta . ((class . Spanner)
2352                  (interfaces . (font-interface
2353                                 horizontal-bracket-interface
2354                                 line-interface
2355                                 side-position-interface
2356                                 text-interface
2357                                 volta-bracket-interface
2358                                 volta-interface))))))
2359
2360     (VoltaBracketSpanner
2361      . (
2362         (after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
2363         (axes . (,Y))
2364         (direction . ,UP)
2365         (no-alignment . #t)
2366         (outside-staff-priority . 600)
2367         (padding . 1)
2368         (side-axis . ,Y)
2369         (X-extent . ,ly:axis-group-interface::width)
2370         (Y-extent . ,ly:axis-group-interface::height)
2371         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2372         (meta . ((class . Spanner)
2373                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2374                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
2375                                       (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
2376                                       (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
2377                  (interfaces . (axis-group-interface
2378                                 side-position-interface
2379                                 volta-interface))))))
2380
2381 ))
2382
2383 (define (completize-grob-entry x)
2384   "Transplant assoc key into 'name entry of 'meta of X.  Set interfaces for Item, Spanner etc.
2385 "
2386   ;;  (display (car x))
2387   ;;  (newline)
2388   (let* ((name-sym  (car x))
2389          (grob-entry (cdr x))
2390          (meta-entry (assoc-get 'meta grob-entry))
2391          (class (assoc-get 'class meta-entry))
2392          (ifaces-entry
2393           (assoc-get 'interfaces meta-entry)))
2394
2395     (cond
2396      ((eq? 'Item class)
2397       (set! ifaces-entry (cons 'item-interface ifaces-entry)))
2398      ((eq? 'Spanner class)
2399       (set! ifaces-entry (cons 'spanner-interface ifaces-entry)))
2400      ((eq? 'Paper_column class)
2401       (set! ifaces-entry (cons 'item-interface
2402                                (cons 'paper-column-interface ifaces-entry))))
2403      ((eq? 'System class)
2404       (set! ifaces-entry (cons 'system-interface
2405                                (cons 'spanner-interface ifaces-entry))))
2406      (else
2407       (ly:warning "Unknown class ~a" class)))
2408
2409     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
2410     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
2411
2412     (set! meta-entry (assoc-set! meta-entry 'name name-sym))
2413     (set! meta-entry (assoc-set! meta-entry 'interfaces
2414                                  ifaces-entry))
2415     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
2416     (cons name-sym grob-entry)))
2417
2418 (set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
2419
2420 ;;  (display (map pair? all-grob-descriptions))
2421
2422 ;; make sure that \property Foo.Bar =\turnOff doesn't complain
2423
2424 (map (lambda (x)
2425        ;; (display (car x)) (newline)
2426
2427        (set-object-property! (car x) 'translation-type? list?)
2428        (set-object-property! (car x) 'is-grob? #t))
2429      all-grob-descriptions)
2430
2431 (set! all-grob-descriptions (sort all-grob-descriptions alist<?))
2432
2433 (define (volta-bracket-interface::pure-height grob start end)
2434   (let ((edge-height (ly:grob-property grob 'edge-height)))
2435     (if (number-pair? edge-height)
2436         (let ((smaller (min (car edge-height) (cdr edge-height)))
2437               (larger (max (car edge-height) (cdr edge-height))))
2438           (interval-union '(0 . 0) (cons smaller larger)))
2439         '(0 . 0))))
2440
2441 (define pure-print-callbacks
2442   (list
2443    fret-board::calc-stencil
2444    note-head::brew-ez-stencil
2445    print-circled-text-callback
2446    laissez-vibrer::print
2447    lyric-text::print
2448    ly:bar-line::print
2449    ly:mensural-ligature::brew-ligature-primitive
2450    ly:note-head::print
2451    ly:dots::print
2452    ly:clef::print
2453    ly:percent-repeat-item-interface::beat-slash
2454    ly:text-interface::print
2455    ly:script-interface::print
2456    ly:sustain-pedal::print))
2457
2458 ;; Sometimes we have grobs with (Y-extent . ,ly:grob::stencil-height)
2459 ;; and the print function is not pure, but there is a easy way to
2460 ;; figure out the Y-extent from the print function.
2461 (define pure-print-to-height-conversions
2462   `(
2463     (,ly:arpeggio::print . ,ly:arpeggio::pure-height)
2464     (,ly:arpeggio::brew-chord-bracket . ,ly:arpeggio::pure-height)
2465     (,ly:hairpin::print . ,ly:hairpin::pure-height)
2466     (,ly:volta-bracket-interface::print . ,volta-bracket-interface::pure-height)))
2467
2468 ;; ly:grob::stencil-extent is safe if the print callback is safe too
2469 (define (pure-stencil-height grob start stop)
2470   (let* ((sten (ly:grob-property-data grob 'stencil))
2471          (pure-height-callback (assoc-get sten pure-print-to-height-conversions)))
2472     (cond ((or
2473             (ly:stencil? sten)
2474             (memq sten pure-print-callbacks))
2475            (ly:grob::stencil-height grob))
2476           ((procedure? pure-height-callback)
2477            (pure-height-callback grob start stop))
2478           (else
2479            '(0 . 0)))))
2480
2481 ;; Sometimes, a pure callback will be chained to a non-pure callback via
2482 ;; chain_offset_callback, in which case this provides a default by simply
2483 ;; passing through the value from the pure callback.
2484 (define (pure-chain-offset-callback grob start end prev-offset) prev-offset)
2485
2486 (define pure-conversions-alist
2487   `(
2488     (,ly:accidental-interface::height . ,ly:accidental-interface::pure-height)
2489     (,ly:axis-group-interface::calc-next-staff-spacing . ,ly:axis-group-interface::calc-pure-next-staff-spacing)
2490     (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
2491     (,ly:grob::stencil-height . ,pure-stencil-height)
2492     (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
2493     (,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback)
2494     (,ly:rest::height . ,ly:rest::pure-height)
2495     (,ly:self-alignment-interface::y-aligned-on-self . ,ly:self-alignment-interface::pure-y-aligned-on-self)
2496     (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
2497     (,ly:slur::height . ,ly:slur::pure-height)
2498     (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
2499     (,ly:stem::height . ,ly:stem::pure-height)
2500     (,ly:system::height . ,ly:system::calc-pure-height)))
2501
2502 (define pure-functions
2503   (list
2504    parenthesize-elements
2505    laissez-vibrer::print
2506    ly:rest::y-offset-callback
2507    ly:staff-symbol-referencer::callback
2508    ly:staff-symbol::height))
2509
2510 (define-public (pure-relevant? grob)
2511   (let ((extent-callback (ly:grob-property-data grob 'Y-extent)))
2512     (not (eq? #f
2513               (or
2514                (pair? extent-callback)
2515                (memq extent-callback pure-functions)
2516                (and
2517                 (pair? (assq extent-callback pure-conversions-alist))
2518                 (let ((stencil (ly:grob-property-data grob 'stencil)))
2519                   (or
2520                    (not (eq? extent-callback ly:grob::stencil-height))
2521                    (memq stencil pure-print-callbacks)
2522                    (assq stencil pure-print-to-height-conversions)
2523                    (ly:stencil? stencil)))))))))
2524
2525 (define-public (call-pure-function unpure args start end)
2526   (if (ly:simple-closure? unpure)
2527       (ly:eval-simple-closure (car args) unpure start end)
2528       (if (not (procedure? unpure))
2529           unpure
2530           (if (memq unpure pure-functions)
2531               (apply unpure args)
2532               (let ((pure (assq unpure pure-conversions-alist)))
2533                 (if pure
2534                     (apply (cdr pure)
2535                            (append
2536                             (list (car args) start end)
2537                             (cdr args)))))))))