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