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