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