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