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