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