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