]> git.donarmstrong.com Git - lilypond.git/blob - scm/define-grobs.scm
Revert "Improves horizontal spacing of axis groups that SpanBars traverse (issue...
[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 . ,ly:axis-group-interface::height)
1844         (meta . ((class . Item)
1845                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
1846                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
1847                  (interfaces . (bar-line-interface
1848                                 font-interface
1849                                 span-bar-interface))))))
1850
1851     (StaffGrouper
1852      . (
1853         (staff-staff-spacing . ((basic-distance . 9)
1854                                 (minimum-distance . 7)
1855                                 (padding . 1)
1856                                 (stretchability . 5)))
1857         (staffgroup-staff-spacing . ((basic-distance . 10.5)
1858                                      (minimum-distance . 8)
1859                                      (padding . 1)
1860                                      (stretchability . 9)))
1861         (meta . ((class . Spanner)
1862                  (interfaces . (staff-grouper-interface))))))
1863
1864     (StaffSpacing
1865      . (
1866         (non-musical . #t)
1867         (stem-spacing-correction . 0.4)
1868         (meta . ((class . Item)
1869                  (interfaces . (spacing-interface
1870                                 staff-spacing-interface))))))
1871
1872     (StaffSymbol
1873      . (
1874         (layer . 0)
1875         (ledger-line-thickness . (1.0 . 0.1))
1876         (line-count . 5)
1877         (stencil . ,ly:staff-symbol::print)
1878         (Y-extent . ,ly:staff-symbol::height)
1879         (meta . ((class . Spanner)
1880                  (interfaces . (staff-symbol-interface))))))
1881
1882     (StanzaNumber
1883      . (
1884         (direction . ,LEFT)
1885         (font-series . bold)
1886         (padding . 1.0)
1887         (side-axis . ,X)
1888         (stencil . ,ly:text-interface::print)
1889         (X-offset . ,ly:side-position-interface::x-aligned-side)
1890         (meta . ((class . Item)
1891                  (interfaces . (font-interface
1892                                 side-position-interface
1893                                 stanza-number-interface
1894                                 text-interface))))))
1895
1896     (Stem
1897      . (
1898         (beamlet-default-length . (1.1 . 1.1))
1899         (beamlet-max-length-proportion . (0.75 . 0.75))
1900         (cross-staff . ,ly:stem::calc-cross-staff)
1901         (default-direction . ,ly:stem::calc-default-direction)
1902         (details
1903          . (
1904             ;; 3.5 (or 3 measured from note head) is standard length
1905             ;; 32nd, 64th, 128th flagged stems should be longer
1906             (lengths . (3.5 3.5 3.5 4.25 5.0 6.0))
1907
1908             ;; FIXME.  3.5 yields too long beams (according to Ross and
1909             ;; looking at Baerenreiter examples) for a number of common
1910             ;; boundary cases.  Subtracting half a beam thickness fixes
1911             ;; this, but the bug may well be somewhere else.
1912
1913             ;; FIXME this should come from 'lengths
1914             (beamed-lengths . (3.26 3.5 3.6))
1915
1916             ;; The 'normal' minima
1917             (beamed-minimum-free-lengths . (1.83 1.5 1.25))
1918                                         ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
1919
1920             ;; The 'extreme case' minima
1921             (beamed-extreme-minimum-free-lengths . (2.0 1.25))
1922
1923             ;; Stems in unnatural (forced) direction should be shortened by
1924             ;; one staff space, according to [Roush & Gourlay].
1925             ;; Flagged stems we shorten only half a staff space.
1926             (stem-shorten . (1.0 0.5))
1927
1928             ))
1929
1930         ;; We use the normal minima as minimum for the ideal lengths,
1931         ;; and the extreme minima as abolute minimum length.
1932
1933         (direction . ,ly:stem::calc-direction)
1934         (duration-log . ,stem::calc-duration-log)
1935         (length . ,stem::length)
1936         (neutral-direction . ,DOWN)
1937         (positioning-done . ,ly:stem::calc-positioning-done)
1938         (stem-info . ,ly:stem::calc-stem-info)
1939         (stem-begin-position . ,ly:stem::calc-stem-begin-position)
1940         (stencil . ,ly:stem::print)
1941         (thickness . 1.3)
1942         (X-extent . ,ly:stem::width)
1943         (X-offset . ,ly:stem::offset-callback)
1944         (Y-extent . ,ly:stem::height)
1945         (Y-offset . ,ly:staff-symbol-referencer::callback)
1946         (meta . ((class . Item)
1947                  (interfaces . (stem-interface))))))
1948
1949     (StemTremolo
1950      . (
1951         (beam-thickness . 0.48) ; staff-space
1952         (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space
1953         (slope . ,ly:stem-tremolo::calc-slope)
1954         (stencil . ,ly:stem-tremolo::print)
1955         (style . ,ly:stem-tremolo::calc-style)
1956         (X-extent . ,ly:stem-tremolo::width)
1957         (Y-offset . ,ly:stem-tremolo::calc-y-offset)
1958         (meta . ((class . Item)
1959                  (interfaces . (stem-tremolo-interface))))))
1960
1961     (StringNumber
1962      . (
1963         (avoid-slur . around)
1964         (cross-staff . ,script-or-side-position-cross-staff)
1965         (font-encoding . fetaText)
1966         (font-size . -5)                ; don't overlap when next to heads.
1967         (padding . 0.5)
1968         (script-priority . 100)
1969         (self-alignment-X . ,CENTER)
1970         (self-alignment-Y . ,CENTER)
1971         (staff-padding . 0.5)
1972         (stencil . ,print-circled-text-callback)
1973         (text . ,string-number::calc-text)
1974         (meta . ((class . Item)
1975                  (interfaces . (font-interface
1976                                 self-alignment-interface
1977                                 side-position-interface
1978                                 string-number-interface
1979                                 text-interface
1980                                 text-script-interface))))))
1981
1982     (StrokeFinger
1983      . (
1984         (digit-names . #("p" "i" "m" "a" "x"))
1985         (font-shape . italic)
1986         (font-size . -4)                ; don't overlap when next to heads.
1987         (padding . 0.5)
1988         (script-priority . 100)
1989         (self-alignment-X . ,CENTER)
1990         (self-alignment-Y . ,CENTER)
1991         (staff-padding . 0.5)
1992         (stencil . ,ly:text-interface::print)
1993         (text . ,stroke-finger::calc-text)
1994         (meta . ((class . Item)
1995                  (interfaces . (font-interface
1996                                 self-alignment-interface
1997                                 side-position-interface
1998                                 stroke-finger-interface
1999                                 text-interface
2000                                 text-script-interface))))))
2001
2002     (SustainPedal
2003      . (
2004         (direction . ,RIGHT)
2005         (extra-spacing-width . (+inf.0 . -inf.0))
2006         (padding . 0.0)  ;; padding relative to SustainPedalLineSpanner
2007         (self-alignment-X . ,CENTER)
2008         (stencil . ,ly:sustain-pedal::print)
2009         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2010         (meta . ((class . Item)
2011                  (interfaces . (font-interface
2012                                 piano-pedal-interface
2013                                 piano-pedal-script-interface
2014                                 self-alignment-interface
2015                                 text-interface))))))
2016
2017     (SustainPedalLineSpanner
2018      . (
2019         (axes . (,Y))
2020         (direction . ,DOWN)
2021         (minimum-space . 1.0)
2022         (outside-staff-priority . 1000)
2023         (padding . 1.2)
2024         (side-axis . ,Y)
2025         (staff-padding . 1.2)
2026         (X-extent . ,ly:axis-group-interface::width)
2027         (Y-extent . ,ly:axis-group-interface::height)
2028         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2029         (meta . ((class . Spanner)
2030                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2031                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
2032                  (interfaces . (axis-group-interface
2033                                 piano-pedal-interface
2034                                 side-position-interface))))))
2035
2036     (System
2037      . (
2038         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
2039         (axes . (,X ,Y))
2040         (skyline-horizontal-padding . 0.5)
2041         (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
2042         (X-extent . ,ly:axis-group-interface::width)
2043         (Y-extent . ,ly:system::height)
2044         (meta . ((class . System)
2045                  (object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
2046                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
2047                  (interfaces . (axis-group-interface
2048                                 system-interface))))))
2049
2050     (SystemStartBar
2051      . (
2052         (collapse-height . 5.0)
2053         (direction . ,LEFT)
2054
2055         ;; ugh--hardcoded.
2056         (padding . -0.1)  ;; bar must cover rounded ending of staff line.
2057         (stencil . ,ly:system-start-delimiter::print)
2058         (style . bar-line)
2059         (thickness . 1.6)
2060         (X-offset . ,ly:side-position-interface::x-aligned-side)
2061         (Y-extent . #f)
2062         (meta . ((class . Spanner)
2063                  (interfaces . (side-position-interface
2064                                 system-start-delimiter-interface))))))
2065
2066     (SystemStartBrace
2067      . (
2068         (collapse-height . 5.0)
2069         (direction . ,LEFT)
2070         (font-encoding . fetaBraces)
2071         (padding . 0.3)
2072         (stencil . ,ly:system-start-delimiter::print)
2073         (style . brace)
2074         (X-offset . ,ly:side-position-interface::x-aligned-side)
2075         (Y-extent . #f)
2076         (meta . ((class . Spanner)
2077                  (interfaces . (font-interface
2078                                 side-position-interface
2079                                 system-start-delimiter-interface))))))
2080
2081     (SystemStartBracket
2082      . (
2083         (collapse-height . 5.0)
2084         (direction . ,LEFT)
2085         (padding . 0.8)
2086         (stencil . ,ly:system-start-delimiter::print)
2087         (style . bracket)
2088         (thickness . 0.45)
2089         (X-offset . ,ly:side-position-interface::x-aligned-side)
2090         (Y-extent . #f)
2091         (meta . ((class . Spanner)
2092                  (interfaces . (font-interface
2093                                 side-position-interface
2094                                 system-start-delimiter-interface))))))
2095
2096     (SystemStartSquare
2097      . (
2098         (direction . ,LEFT)
2099         (stencil . ,ly:system-start-delimiter::print)
2100         (style . line-bracket)
2101         (thickness . 1.0)
2102         (X-offset . ,ly:side-position-interface::x-aligned-side)
2103         (Y-extent . #f)
2104         (meta . ((class . Spanner)
2105                  (interfaces . (font-interface
2106                                 side-position-interface
2107                                 system-start-delimiter-interface))))))
2108
2109
2110     (TabNoteHead
2111      . (
2112         (details . ((cautionary-properties . ((angularity . 0.4)
2113                                               (half-thickness . 0.075)
2114                                               (padding . 0)
2115                                               (procedure . ,parenthesize-stencil)
2116                                               (width . 0.25)))
2117                     (head-offset . 3/5)
2118                     (harmonic-properties . ((angularity . 2)
2119                                             (half-thickness . 0.075)
2120                                             (padding . 0)
2121                                             (procedure . ,parenthesize-stencil)
2122                                             (width . 0.25)))
2123                     (repeat-tied-properties . ((note-head-visible . #t)
2124                                                (parenthesize . #t)))
2125                     (tied-properties . ((break-visibility . ,begin-of-line-visible)
2126                                         (parenthesize . #t)))))
2127
2128         (direction . ,CENTER)
2129         (duration-log . ,note-head::calc-duration-log)
2130         (font-series . bold)
2131         (font-size . -2)
2132         (stem-attachment . (0.0 . 1.35))
2133         (stencil . ,tab-note-head::print)
2134         (whiteout . #t)
2135         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2136         (Y-offset . ,ly:staff-symbol-referencer::callback)
2137         (meta . ((class . Item)
2138                  (interfaces  . (font-interface
2139                                  note-head-interface
2140                                  rhythmic-grob-interface
2141                                  rhythmic-head-interface
2142                                  staff-symbol-referencer-interface
2143                                  tab-note-head-interface
2144                                  text-interface))))))
2145
2146     (TextScript
2147      . (
2148         (avoid-slur . around)
2149         (cross-staff . ,script-or-side-position-cross-staff)
2150         (direction . ,DOWN)
2151         (extra-spacing-width . (+inf.0 . -inf.0))
2152         (outside-staff-priority . 450)
2153
2154         ;; sync with Fingering ?
2155         (padding . 0.5)
2156
2157         (script-priority . 200)
2158         (side-axis . ,Y)
2159         (slur-padding . 0.5)
2160         (staff-padding . 0.5)
2161         (stencil . ,ly:text-interface::print)
2162         ;; todo: add X self alignment?
2163         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2164         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2165         (meta . ((class . Item)
2166                  (interfaces . (font-interface
2167                                 instrument-specific-markup-interface
2168                                 self-alignment-interface
2169                                 side-position-interface
2170                                 text-interface
2171                                 text-script-interface))))))
2172
2173     (TextSpanner
2174      . (
2175         (bound-details . ((left . ((Y . 0)
2176                                    (padding . 0.25)
2177                                    (attach-dir . ,LEFT)
2178                                    ))
2179                           (left-broken . ((end-on-note . #t)))
2180                           (right . ((Y . 0)
2181                                     (padding . 0.25)
2182                                     ))
2183                           ))
2184         (dash-fraction . 0.2)
2185         (dash-period . 3.0)
2186         (direction . ,UP)
2187         (font-shape . italic)
2188         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2189         (outside-staff-priority . 350)
2190         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2191         (side-axis . ,Y)
2192         (staff-padding . 0.8)
2193         (stencil . ,ly:line-spanner::print)
2194         (style . dashed-line)
2195         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2196
2197         (meta . ((class . Spanner)
2198                  (interfaces . (font-interface
2199                                 line-interface
2200                                 line-spanner-interface
2201                                 side-position-interface))))))
2202
2203     (Tie
2204      . (
2205         (avoid-slur . inside)
2206         (control-points . ,ly:tie::calc-control-points)
2207         (details . (
2208                     ;; for a full list, see tie-details.cc
2209                     (ratio . 0.333)
2210                     (center-staff-line-clearance . 0.6)
2211                     (tip-staff-line-clearance . 0.45)
2212                     (note-head-gap . 0.2)
2213                     (stem-gap . 0.35)
2214                     (height-limit . 1.0)
2215                     (horizontal-distance-penalty-factor . 10)
2216                     (same-dir-as-stem-penalty . 8)
2217                     (min-length-penalty-factor . 26)
2218                     (tie-tie-collision-distance . 0.45)
2219                     (tie-tie-collision-penalty . 25.0)
2220                     (intra-space-threshold . 1.25)
2221                     (outer-tie-vertical-distance-symmetry-penalty-factor . 10)
2222                     (outer-tie-length-symmetry-penalty-factor . 10)
2223                     (vertical-distance-penalty-factor . 7)
2224                     (outer-tie-vertical-gap . 0.25)
2225                     (multi-tie-region-size . 3)
2226                     (single-tie-region-size . 4)
2227                     (between-length-limit . 1.0)))
2228
2229         (direction . ,ly:tie::calc-direction)
2230         (font-size . -6)
2231         (line-thickness . 0.8)
2232         (neutral-direction . ,UP)
2233         (springs-and-rods . ,ly:spanner::set-spacing-rods)
2234         (stencil . ,ly:tie::print)
2235         (thickness . 1.2)
2236         (meta . ((class . Spanner)
2237                  (interfaces . (tie-interface))))))
2238
2239     (TieColumn
2240      . (
2241         (before-line-breaking . ,ly:tie-column::before-line-breaking)
2242         (positioning-done . ,ly:tie-column::calc-positioning-done)
2243         (X-extent . #f)
2244         (Y-extent . #f)
2245         (meta . ((class . Spanner)
2246                  (interfaces . (tie-column-interface))))))
2247
2248     (TimeSignature
2249      . (
2250         (avoid-slur . inside)
2251         (break-align-anchor
2252          . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
2253         (break-align-symbol . time-signature)
2254         (break-align-anchor-alignment . ,LEFT)
2255         (break-visibility . ,all-visible)
2256         (extra-spacing-height . (-1.0 . 1.0))
2257         (extra-spacing-width . (0.0 . 0.8))
2258         (non-musical . #t)
2259         (space-alist . (
2260                         (cue-clef . (extra-space . 1.5))
2261                         (first-note . (fixed-space . 2.0))
2262                         (right-edge . (extra-space . 0.5))
2263                         (staff-bar . (minimum-space . 2.0))))
2264         (stencil . ,ly:time-signature::print)
2265         (style . C)
2266         (meta . ((class . Item)
2267                  (interfaces . (break-aligned-interface
2268                                 font-interface
2269                                 time-signature-interface))))))
2270
2271     (TrillPitchAccidental
2272      . (
2273         (direction . ,LEFT)
2274         (font-size . -4)
2275         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
2276         (padding . 0.2)
2277         (side-axis . ,X)
2278         (stencil . ,ly:accidental-interface::print)
2279         (X-offset . ,ly:side-position-interface::x-aligned-side)
2280         (Y-extent . ,ly:accidental-interface::height)
2281         (meta . ((class . Item)
2282                  (interfaces . (accidental-interface
2283                                 font-interface
2284                                 inline-accidental-interface
2285                                 side-position-interface
2286                                 trill-pitch-accidental-interface))))))
2287
2288     (TrillPitchGroup
2289      . (
2290         (axes . (,X))
2291         (direction . ,RIGHT)
2292         (font-size . -4)
2293         (padding . 0.3)
2294         (side-axis . ,X)
2295         (stencil . ,parenthesize-elements)
2296         (stencils . ,parentheses-item::calc-parenthesis-stencils)
2297         (X-offset . ,ly:side-position-interface::x-aligned-side)
2298         (meta . ((class . Item)
2299                  (interfaces . (axis-group-interface
2300                                 font-interface
2301                                 note-head-interface
2302                                 parentheses-interface
2303                                 side-position-interface))))))
2304
2305     (TrillPitchHead
2306      . (
2307         (duration-log . 2)
2308         (font-size . -4)
2309         (stencil . ,ly:note-head::print)
2310         (Y-offset . ,ly:staff-symbol-referencer::callback)
2311         (meta . ((class . Item)
2312                  (interfaces . (font-interface
2313                                 ledgered-interface
2314                                 pitched-trill-interface
2315                                 rhythmic-head-interface
2316                                 staff-symbol-referencer-interface))))))
2317
2318     (TrillSpanner
2319      . (
2320         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
2321         (bound-details . ((left . ((text . ,(make-musicglyph-markup "scripts.trill"))
2322                                    (Y . 0)
2323                                    (stencil-offset . (-0.5 . -1))
2324                                    (padding . 0.5)
2325                                    (attach-dir . ,CENTER)
2326                                    ))
2327                           (left-broken . ((end-on-note . #t)))
2328                           (right . ((Y . 0)))
2329                           ))
2330         (direction . ,UP)
2331         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2332         (outside-staff-priority . 50)
2333         (padding . 0.5)
2334         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2335         (side-axis . ,Y)
2336         (staff-padding . 1.0)
2337         (stencil . ,ly:line-spanner::print)
2338         (style . trill)
2339         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2340         (meta . ((class . Spanner)
2341                  (interfaces . (font-interface
2342                                 line-interface
2343                                 line-spanner-interface
2344                                 side-position-interface
2345                                 trill-spanner-interface))))))
2346
2347     (TupletBracket
2348      . (
2349         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
2350         (cross-staff . ,ly:tuplet-bracket::calc-cross-staff)
2351         (direction  . ,ly:tuplet-bracket::calc-direction)
2352         (edge-height . (0.7 . 0.7))
2353         (full-length-to-extent . #t)
2354         (padding . 1.1)
2355         (positions . ,ly:tuplet-bracket::calc-positions)
2356         (shorten-pair . (-0.2 . -0.2))
2357         (staff-padding . 0.25)
2358         (stencil . ,ly:tuplet-bracket::print)
2359         (thickness . 1.6)
2360         (X-positions . ,ly:tuplet-bracket::calc-x-positions)
2361
2362         (meta . ((class . Spanner)
2363                  (interfaces . (line-interface
2364                                 tuplet-bracket-interface))))))
2365
2366     (TupletNumber
2367      . (
2368         (avoid-slur . inside)
2369         (cross-staff . ,ly:tuplet-number::calc-cross-staff)
2370         (direction . ,tuplet-number::calc-direction)
2371         (font-shape . italic)
2372         (font-size . -2)
2373         (stencil . ,ly:tuplet-number::print)
2374         (text . ,tuplet-number::calc-denominator-text)
2375         (X-offset . ,ly:tuplet-number::calc-x-offset)
2376         (Y-offset . ,ly:tuplet-number::calc-y-offset)
2377         (meta . ((class . Spanner)
2378                  (interfaces . (font-interface
2379                                 text-interface
2380                                 tuplet-number-interface))))))
2381
2382
2383     (UnaCordaPedal
2384      . (
2385         (direction . ,RIGHT)
2386         (extra-spacing-width . (+inf.0 . -inf.0))
2387         (font-shape . italic)
2388         (padding . 0.0)  ;; padding relative to UnaCordaPedalLineSpanner
2389         (self-alignment-X . ,CENTER)
2390         (stencil . ,ly:text-interface::print)
2391         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
2392         (meta . ((class . Item)
2393                  (interfaces . (font-interface
2394                                 piano-pedal-script-interface
2395                                 self-alignment-interface
2396                                 text-interface))))))
2397
2398     (UnaCordaPedalLineSpanner
2399      . (
2400         (axes . (,Y))
2401         (direction . ,DOWN)
2402         (minimum-space . 1.0)
2403         (outside-staff-priority . 1000)
2404         (padding . 1.2)
2405         (side-axis . ,Y)
2406         (staff-padding . 1.2)
2407         (X-extent . ,ly:axis-group-interface::width)
2408         (Y-extent . ,ly:axis-group-interface::height)
2409         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2410         (meta . ((class . Spanner)
2411                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2412                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
2413                  (interfaces . (axis-group-interface
2414                                 piano-pedal-interface
2415                                 side-position-interface))))))
2416
2417
2418     (VaticanaLigature
2419      . (
2420         (flexa-width . 2.0)
2421         (stencil . ,ly:vaticana-ligature::print)
2422         (thickness . 0.6)
2423         (meta . ((class . Spanner)
2424                  (interfaces . (font-interface
2425                                 vaticana-ligature-interface))))))
2426
2427     (VerticalAlignment
2428      . (
2429         (axes . (,Y))
2430         (positioning-done . ,ly:align-interface::align-to-ideal-distances)
2431         (stacking-dir . -1)
2432         (vertical-skylines . ,ly:axis-group-interface::combine-skylines)
2433         (X-extent . ,ly:axis-group-interface::width)
2434         (Y-extent . ,ly:axis-group-interface::height)
2435         (meta . ((class . Spanner)
2436                  (object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)
2437                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
2438                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
2439                  (interfaces . (align-interface
2440                                 axis-group-interface))))))
2441
2442     (VerticalAxisGroup
2443      . (
2444         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
2445         (axes . (,Y))
2446         (default-staff-staff-spacing . ((basic-distance . 9)
2447                                         (minimum-distance . 8)
2448                                         (padding . 1)))
2449         (nonstaff-unrelatedstaff-spacing . ((padding . 0.5)))
2450         (staff-staff-spacing . ,ly:axis-group-interface::calc-staff-staff-spacing)
2451         (stencil . ,ly:axis-group-interface::print)
2452         (vertical-skylines . ,ly:hara-kiri-group-spanner::calc-skylines)
2453         (X-extent . ,ly:axis-group-interface::width)
2454         (Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
2455         (Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
2456         (meta . ((class . Spanner)
2457                  (object-callbacks . (
2458                                       (X-common . ,ly:axis-group-interface::calc-x-common)
2459                                       (pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2460                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
2461
2462                  (interfaces . (axis-group-interface
2463                                 hara-kiri-group-spanner-interface))))))
2464
2465     (VoiceFollower
2466      . (
2467         (after-line-breaking . ,ly:spanner::kill-zero-spanned-time)
2468         (bound-details . ((right . ((attach-dir .  ,CENTER)
2469                                     (padding . 1.5)
2470                                       ))
2471                           (left . ((attach-dir .  ,CENTER)
2472                                    (padding . 1.5)
2473                                       ))
2474                           ))
2475         (gap . 0.5)
2476         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2477         (non-musical . #t)
2478         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2479         (stencil . ,ly:line-spanner::print)
2480         (style . line)
2481         (X-extent . #f)
2482         (Y-extent . #f)
2483         (meta . ((class . Spanner)
2484                  (interfaces . (line-interface
2485                                 line-spanner-interface))))))
2486
2487     (VoltaBracket
2488      . (
2489         (direction . ,UP)
2490         (edge-height . (2.0 . 2.0)) ;; staff-space;
2491         (font-encoding . fetaText)
2492         (font-size . -4)
2493         (stencil . ,ly:volta-bracket-interface::print)
2494         (thickness . 1.6) ;; line-thickness
2495         (word-space . 0.6)
2496         (meta . ((class . Spanner)
2497                  (interfaces . (font-interface
2498                                 horizontal-bracket-interface
2499                                 line-interface
2500                                 side-position-interface
2501                                 text-interface
2502                                 volta-bracket-interface
2503                                 volta-interface))))))
2504
2505     (VoltaBracketSpanner
2506      . (
2507         (after-line-breaking . ,ly:side-position-interface::move-to-extremal-staff)
2508         (axes . (,Y))
2509         (direction . ,UP)
2510         (no-alignment . #t)
2511         (outside-staff-priority . 600)
2512         (padding . 1)
2513         (side-axis . ,Y)
2514         (X-extent . ,ly:axis-group-interface::width)
2515         (Y-extent . ,ly:axis-group-interface::height)
2516         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2517         (meta . ((class . Spanner)
2518                  (object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
2519                                       (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
2520                  (interfaces . (axis-group-interface
2521                                 side-position-interface
2522                                 volta-interface))))))
2523
2524 ))
2525
2526 (define (completize-grob-entry x)
2527   "Transplant assoc key into 'name entry of 'meta of X.  Set interfaces for Item, Spanner etc.
2528 "
2529   ;;  (display (car x))
2530   ;;  (newline)
2531   (let* ((name-sym  (car x))
2532          (grob-entry (cdr x))
2533          (meta-entry (assoc-get 'meta grob-entry))
2534          (class (assoc-get 'class meta-entry))
2535          (ifaces-entry
2536           (assoc-get 'interfaces meta-entry)))
2537
2538     (cond
2539      ((eq? 'Item class)
2540       (set! ifaces-entry (cons 'item-interface ifaces-entry)))
2541      ((eq? 'Spanner class)
2542       (set! ifaces-entry (cons 'spanner-interface ifaces-entry)))
2543      ((eq? 'Paper_column class)
2544       (set! ifaces-entry (cons 'item-interface
2545                                (cons 'paper-column-interface ifaces-entry))))
2546      ((eq? 'System class)
2547       (set! ifaces-entry (cons 'system-interface
2548                                (cons 'spanner-interface ifaces-entry))))
2549      (else
2550       (ly:warning "Unknown class ~a" class)))
2551
2552     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
2553     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
2554
2555     (set! meta-entry (assoc-set! meta-entry 'name name-sym))
2556     (set! meta-entry (assoc-set! meta-entry 'interfaces
2557                                  ifaces-entry))
2558     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
2559     (cons name-sym grob-entry)))
2560
2561 (set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
2562
2563 ;;  (display (map pair? all-grob-descriptions))
2564
2565 ;; make sure that \property Foo.Bar =\turnOff doesn't complain
2566
2567 (map (lambda (x)
2568        ;; (display (car x)) (newline)
2569
2570        (set-object-property! (car x) 'translation-type? list?)
2571        (set-object-property! (car x) 'is-grob? #t))
2572      all-grob-descriptions)
2573
2574 (set! all-grob-descriptions (sort all-grob-descriptions alist<?))
2575
2576 (define (volta-bracket-interface::pure-height grob start end)
2577   (let ((edge-height (ly:grob-property grob 'edge-height)))
2578     (if (number-pair? edge-height)
2579         (let ((smaller (min (car edge-height) (cdr edge-height)))
2580               (larger (max (car edge-height) (cdr edge-height))))
2581           (interval-union '(0 . 0) (cons smaller larger)))
2582         '(0 . 0))))
2583
2584 (define pure-print-callbacks
2585   (list
2586    fret-board::calc-stencil
2587    note-head::brew-ez-stencil
2588    print-circled-text-callback
2589    laissez-vibrer::print
2590    lyric-text::print
2591    ly:bar-line::print
2592    ly:mensural-ligature::brew-ligature-primitive
2593    ly:note-head::print
2594    ly:dots::print
2595    ly:clef::print
2596    ly:flag::print
2597    default-flag
2598    normal-flag
2599    mensural-flag
2600    no-flag
2601    modern-straight-flag
2602    old-straight-flag
2603    ly:key-signature-interface::print
2604    ly:percent-repeat-item-interface::beat-slash
2605    ly:text-interface::print
2606    ly:script-interface::print
2607    ly:sustain-pedal::print))
2608
2609 ;; Sometimes we have grobs with (Y-extent . ,ly:grob::stencil-height)
2610 ;; and the print function is not pure, but there is a easy way to
2611 ;; figure out the Y-extent from the print function.
2612 (define pure-print-to-height-conversions
2613   `(
2614     (,ly:arpeggio::print . ,ly:arpeggio::pure-height)
2615     (,ly:arpeggio::brew-chord-bracket . ,ly:arpeggio::pure-height)
2616     (,ly:arpeggio::brew-chord-slur . ,ly:arpeggio::pure-height)
2617     (,ly:hairpin::print . ,ly:hairpin::pure-height)
2618     (,ly:stem-tremolo::print . ,ly:stem-tremolo::pure-height)
2619     (,ly:volta-bracket-interface::print . ,volta-bracket-interface::pure-height)))
2620
2621 ;; ly:grob::stencil-extent is safe if the print callback is safe too
2622 (define (pure-stencil-height grob start stop)
2623   (let* ((sten (ly:grob-property-data grob 'stencil))
2624          (pure-height-callback (assoc-get sten pure-print-to-height-conversions)))
2625     (cond ((or
2626             (ly:stencil? sten)
2627             (memq sten pure-print-callbacks))
2628            (ly:grob::stencil-height grob))
2629           ((procedure? pure-height-callback)
2630            (pure-height-callback grob start stop))
2631           (else
2632            '(0 . 0)))))
2633
2634 ;; Sometimes, a pure callback will be chained to a non-pure callback via
2635 ;; chain_offset_callback, in which case this provides a default by simply
2636 ;; passing through the value from the pure callback.
2637 (define (pure-chain-offset-callback grob start end prev-offset) prev-offset)
2638
2639 (define pure-conversions-alist
2640   `(
2641     (,ly:accidental-interface::height . ,ly:accidental-interface::pure-height)
2642     (,ly:axis-group-interface::calc-staff-staff-spacing . ,ly:axis-group-interface::calc-pure-staff-staff-spacing)
2643     (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
2644     (,ly:beam::rest-collision-callback . ,ly:beam::pure-rest-collision-callback)
2645     (,ly:grob::stencil-height . ,pure-stencil-height)
2646     (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
2647     (,ly:rest-collision::force-shift-callback-rest . ,pure-chain-offset-callback)
2648     (,ly:rest::height . ,ly:rest::pure-height)
2649     (,ly:self-alignment-interface::y-aligned-on-self . ,ly:self-alignment-interface::pure-y-aligned-on-self)
2650     (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
2651     (,ly:slur::height . ,ly:slur::pure-height)
2652     (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
2653     (,ly:stem::calc-stem-begin-position . ,ly:stem::pure-calc-stem-begin-position)
2654     (,ly:stem::calc-stem-end-position . ,ly:stem::pure-calc-stem-end-position)
2655     (,stem::length . ,stem::pure-length)
2656     (,ly:stem::height . ,ly:stem::pure-height)
2657     (,ly:stem-tremolo::calc-y-offset . ,ly:stem-tremolo::pure-calc-y-offset)
2658     (,ly:system::height . ,ly:system::calc-pure-height)))
2659
2660 (define pure-functions
2661   (list
2662    parenthesize-elements
2663    laissez-vibrer::print
2664    ly:flag::calc-y-offset
2665    ly:rest::y-offset-callback
2666    ly:staff-symbol-referencer::callback
2667    ly:staff-symbol::height))
2668
2669 (define-public (pure-relevant? grob)
2670   (let ((extent-callback (ly:grob-property-data grob 'Y-extent)))
2671     (not (eq? #f
2672               (or
2673                (ly:unpure-pure-container? extent-callback)
2674                (pair? extent-callback)
2675                (memq extent-callback pure-functions)
2676                (and
2677                 (pair? (assq extent-callback pure-conversions-alist))
2678                 (let ((stencil (ly:grob-property-data grob 'stencil)))
2679                   (or
2680                    (not (eq? extent-callback ly:grob::stencil-height))
2681                    (memq stencil pure-print-callbacks)
2682                    (assq stencil pure-print-to-height-conversions)
2683                    (ly:stencil? stencil)))))))))
2684
2685 ;; hideous code dup below - to be cleaned up when call pure functino
2686 ;; is eliminated and lilypond works entirely from unpure-pure-containers
2687
2688 (define-public (call-pure-function unpure args start end)
2689   (if (ly:unpure-pure-container? unpure)
2690       (let ((unpure (ly:unpure-pure-container-pure-part unpure)))
2691         (if (ly:simple-closure? unpure)
2692           (ly:eval-simple-closure (car args) unpure start end)
2693           (if (not (procedure? unpure))
2694               unpure
2695               (apply (cdr pure)
2696                      (append
2697                        (list (car args) start end)
2698                        (cdr args))))))
2699       (if (ly:simple-closure? unpure)
2700           (ly:eval-simple-closure (car args) unpure start end)
2701           (if (not (procedure? unpure))
2702               unpure
2703               (if (memq unpure pure-functions)
2704                   (apply unpure args)
2705                   (let ((pure (assq unpure pure-conversions-alist)))
2706                     (if pure
2707                         (apply (cdr pure)
2708                                (append
2709                                 (list (car args) start end)
2710                                 (cdr args))))))))))