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