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