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