]> git.donarmstrong.com Git - lilypond.git/blob - scm/define-grobs.scm
Merge branch 'master' of git+ssh://repo.or.cz/srv/git/lilypond
[lilypond.git] / scm / define-grobs.scm
1 ;;;; define-grobs.scm --
2 ;;;;
3 ;;;;  source file of the GNU LilyPond music typesetter
4 ;;;;
5 ;;;; (c) 1998--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
7
8 ;;;; distances are given in line-thickness (thicknesses) and
9 ;;;; staff-space (distances)
10
11 ;;;; WARNING: the meta field should be the last one.
12 ;;;; WARNING: don't use anonymous functions for initialization.
13
14 ;; TODO: junk the meta field in favor of something more compact?
15
16 ;;; todo:: reorder sensibly.
17
18 (define-public all-grob-descriptions
19   `(
20     (Accidental
21      . (
22         (avoid-slur . inside)
23         (cautionary-style . parentheses)
24         (stencil . ,ly:accidental-interface::print)
25         (after-line-breaking
26          . ,ly:accidental-interface::after-line-breaking)
27         (meta . ((class . Item)
28                  (interfaces . (accidental-interface
29                                 font-interface))))))
30     
31     (AccidentalSuggestion
32      . (
33         (stencil . ,ly:accidental-interface::print)
34         (X-offset . ,(ly:make-simple-closure
35                       `(,+
36                         ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent))
37                         ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
38         (self-alignment-X . ,CENTER)
39         (cautionary . #t)
40         (cautionary-style . smaller)
41         (Y-offset . ,ly:side-position-interface::y-aligned-side)
42         (cautionary-style . parentheses)
43         (direction . ,UP)
44         (staff-padding . 0.25)
45         (script-priority . 0)
46         (side-axis . ,X)
47         (meta . ((class . Item)
48                  (interfaces . (side-position-interface
49                                 script-interface
50                                 accidental-interface
51                                 accidental-suggestion-interface
52                                 self-alignment-interface
53                                 font-interface))))))
54     (AccidentalPlacement
55      . (
56         (left-padding . 0.2)
57
58         ;; for horizontally stacked scripts.
59         (script-priority .  -100)
60         (direction .  ,LEFT)
61         
62         (positioning-done . ,ly:accidental-placement::calc-positioning-done)
63         (X-extent . ,ly:axis-group-interface::width)                  
64         
65         ;; this is quite small, but it is very ugly to have
66         ;; accs closer to the previous note than to the next one.
67         (right-padding . 0.15)
68         (meta . ((class . Item)
69                  (interfaces . (accidental-placement-interface))))))
70     
71     (Ambitus
72      . (
73         (axes . (0 1))
74         (X-extent . ,ly:axis-group-interface::width)
75         (Y-extent . ,ly:axis-group-interface::height)
76         (space-alist . (
77                         (clef . (extra-space . 0.5))
78                         (key-signature . (extra-space . 0.0))
79                         (staff-bar . (extra-space . 0.0))
80                         (time-signature . (extra-space . 0.0))
81                         (first-note . (fixed-space . 0.0))))
82         (non-musical . #t)
83         (break-align-symbol . ambitus)
84         (break-visibility . ,begin-of-line-visible)
85         (meta . ((class . Item)
86                  (interfaces . (axis-group-interface
87                                 break-aligned-interface
88                                 ambitus-interface))))))
89
90     (AmbitusLine
91      . (
92         (stencil . ,ly:ambitus::print)
93         (join-heads . #t)
94         (thickness . 2)
95         (X-offset . ,ly:self-alignment-interface::centered-on-x-parent)
96         (meta . ((class . Item)
97                  (interfaces . (ambitus-interface
98                                 staff-symbol-referencer-interface
99                                 font-interface))))))
100     (AmbitusAccidental
101      . (
102         (font-family . music)
103         (padding . 0.5)
104         (X-offset . ,ly:side-position-interface::x-aligned-side)
105         (direction . ,LEFT)
106         (cautionary-style . parentheses)
107         (stencil . ,ly:accidental-interface::print)
108         (after-line-breaking . ,ly:accidental-interface::after-line-breaking)
109         (side-axis . ,X)
110         (meta . ((class . Item)
111                  (interfaces . (item-interface
112                                 accidental-interface
113                                 break-aligned-interface
114                                 side-position-interface
115                                 font-interface))))))
116
117     (AmbitusNoteHead
118      . (
119         (duration-log . 2)
120         (stencil . ,ly:note-head::print)
121         (glyph-name . ,note-head::calc-glyph-name)
122         (Y-offset . ,ly:staff-symbol-referencer::callback)
123         (meta . ((class . Item)
124                  (interfaces . (font-interface
125                                 note-head-interface
126                                 ambitus-interface
127                                 staff-symbol-referencer-interface
128                                 rhythmic-head-interface
129                                 ledgered-interface))))))
130
131     (Arpeggio
132      . ((X-extent . ,ly:arpeggio::width)
133         (stencil . ,ly:arpeggio::print)
134         (Y-offset . ,ly:staff-symbol-referencer::callback)
135         (X-offset . ,ly:side-position-interface::x-aligned-side)
136         (direction . ,LEFT)
137         (padding . 0.5)
138         (script-priority . 0)
139         (side-axis . ,X)
140         (staff-position . 0.0)
141         (meta . ((class . Item)
142                  (interfaces . (arpeggio-interface
143                                 staff-symbol-referencer-interface
144                                 side-position-interface
145                                 font-interface))))))
146
147     (BalloonTextItem 
148      . ((stencil . ,ly:balloon-interface::print)
149         (text . ,(grob::calc-property-by-copy 'text)) 
150         (X-offset . ,(grob::calc-property-by-copy 'X-offset)) 
151         (Y-offset . ,(grob::calc-property-by-copy 'Y-offset)) 
152         (meta . ((class . Item)
153                  (interfaces . (text-interface
154                                 font-interface))))))
155     (BarLine
156      . (
157         (break-align-symbol . staff-bar)
158         (glyph . "|")
159         (gap . 0.4)
160         (layer . 0)
161         (break-visibility . ,all-visible)
162         (non-musical . #t)
163
164         (stencil . ,ly:bar-line::print)
165         (glyph-name . ,bar-line::calc-glyph-name)
166         (bar-size .  ,ly:bar-line::calc-bar-size)
167         
168         (space-alist . (
169                         (time-signature . (extra-space . 0.75))
170                         (custos . (minimum-space . 2.0))
171                         (clef . (minimum-space . 1.0))
172                         (key-signature . (extra-space . 1.0))
173                         (key-cancellation . (extra-space . 1.0))
174                         (first-note . (fixed-space . 1.3))
175                         (next-note . (semi-fixed-space . 1.3))
176                         (right-edge . (extra-space . 0.0))))
177
178         ;;
179         ;; Ross. page 151 lists other values, we opt for a leaner look
180         ;;
181         ;; TODO:
182         ;; kern should scale with line-thickness too.
183         (kern . 3.0)
184         (thin-kern . 3.0)
185         (hair-thickness . 1.9)
186         (thick-thickness . 6.0)
187         (meta . ((class . Item)
188                  (interfaces . (bar-line-interface
189                                 break-aligned-interface
190                                 font-interface))))))
191
192     (BarNumber
193      . (
194         (stencil . ,ly:text-interface::print)
195         (non-musical . #t)
196         (break-visibility . ,begin-of-line-visible)
197         (padding . 1.0)
198         (direction . ,UP)
199         (font-family . roman)
200         (font-size . -2)
201         (Y-offset . ,ly:side-position-interface::y-aligned-side)
202         (side-axis . ,Y)
203         (X-offset . ,(ly:make-simple-closure
204                       `(,+
205                         ,(ly:make-simple-closure
206                           (list ly:break-alignment-align-interface::self-align-callback))
207                         ,(ly:make-simple-closure
208                           (list ly:self-alignment-interface::x-aligned-on-self)))))
209
210         (self-alignment-X . 1)
211
212         ;; want the bar number before the clef at line start. 
213         (break-align-symbol . left-edge)
214         (meta .
215               ((class . Item)
216                (interfaces . (side-position-interface
217                               text-interface
218                               break-alignment-align-interface
219                               self-alignment-interface
220                               font-interface
221                               ))))
222         ))
223
224     (BassFigure
225      . (
226         (stencil . ,ly:text-interface::print)
227         (meta . ((class . Item)
228                  (interfaces . (text-interface
229                                 rhythmic-grob-interface
230                                 bass-figure-interface
231                                 font-interface))))))
232
233     (BassFigureAlignment
234      . (
235         (axes . (,Y))
236         (threshold . (2 . 1000))
237         (positioning-done . ,ly:align-interface::calc-positioning-done)
238         (Y-extent . ,ly:axis-group-interface::height)
239         (stacking-dir . -1)
240         (meta . ((class . Spanner)
241                  (interfaces . (align-interface
242                                 bass-figure-alignment-interface
243                                 axis-group-interface))))))
244
245     (BassFigureAlignmentPositioning
246      . ((Y-offset . ,ly:side-position-interface::y-aligned-side)
247         (side-axis . ,Y)
248         (direction . ,UP)
249         (Y-extent . ,ly:axis-group-interface::height)
250         (axes . (,Y))
251         (staff-padding . 1.0)
252         (padding . 0.5)
253         (meta . ((class . Spanner)
254                  (interfaces . (side-position-interface
255                                 axis-group-interface
256                              ))))))
257     
258     (BassFigureBracket
259      . (
260         (stencil . ,ly:enclosing-bracket::print)
261         (X-extent . ,ly:enclosing-bracket::width)
262         (edge-height . (0.2 . 0.2))
263         (meta . ((class . Item)
264                  (interfaces . (enclosing-bracket-interface)) ))
265         ))
266     (BassFigureContinuation
267      . (
268         (stencil . ,ly:figured-bass-continuation::print)
269         (Y-offset . ,ly:figured-bass-continuation::center-on-figures)
270         (meta . ((class . Spanner)
271                  (interfaces . (figured-bass-continuation-interface))
272                  ))))
273     (BassFigureLine
274      . (
275         (axes . (,Y))
276         (Y-extent . ,ly:axis-group-interface::height)
277         (meta . ((class . Spanner)
278                  (interfaces . (axis-group-interface
279                                 ))))))
280
281
282     (Beam
283      . (
284         ;; todo: clean this up a bit: the list is getting
285         ;; rather long.
286         (gap . 0.8)
287         (positions .  ,(ly:make-simple-closure
288                         (ly:make-simple-closure
289                          (list chain-grob-member-functions
290                            `(,cons 0 0)
291                            ly:beam::calc-least-squares-positions
292                            ly:beam::slope-damping
293                            ly:beam::shift-region-to-valid
294                            ly:beam::quanting
295                            ))))
296
297         ;; this is a hack to set stem lengths, if positions is set.
298         (quantized-positions . ,ly:beam::set-stem-lengths)
299         (concaveness . ,ly:beam::calc-concaveness)
300         (direction . ,ly:beam::calc-direction)
301         (shorten . ,ly:beam::calc-stem-shorten)
302         (beaming . ,ly:beam::calc-beaming)
303         (stencil . ,ly:beam::print)
304         (clip-edges . #t)
305         
306         ;; TODO: should be in SLT.
307         (thickness . 0.48) ; in staff-space
308         (neutral-direction . ,DOWN)
309
310         ;; Whe have some unreferenced problems here.
311         ;;
312         ;; If we shorten beamed stems less than normal stems (1 staff-space),
313         ;; or high order less than 8th beams, patterns like
314         ;;     c''4 [c''8 c''] c''4 [c''16 c]
315         ;; are ugly (different stem lengths).
316         ;;
317         ;; But if we shorten 16th beams as much as 8th beams, a single
318         ;; forced 16th beam looks *very* short.
319
320         ;; We choose to shorten 8th beams the same as single stems,
321         ;; and high order beams less than 8th beams, so that all
322         ;; isolated shortened beams look nice and a bit shortened,
323         ;; sadly possibly breaking patterns with high order beams.
324         (beamed-stem-shorten . (1.0 0.5 0.25))
325         (damping . 1)
326         (auto-knee-gap . 5.5)
327
328         ;; only for debugging.
329         (font-family . roman)
330         (meta . ((class . Spanner)
331                  (interfaces . (staff-symbol-referencer-interface
332                                 beam-interface))))))
333
334     (BendAfter
335      . (
336         (stencil . ,fall::print)
337         (thickness . 2.0)
338         (meta . ((class . Spanner)
339                  (interfaces . (spanner-interface
340                                 bend-after-interface))))))
341
342     (BreakAlignment
343      . (
344         (non-musical . #t)
345         (stacking-dir . 1)
346         (positioning-done . ,ly:break-align-interface::calc-positioning-done)
347         (X-extent . ,ly:axis-group-interface::width)
348         (break-align-orders . ;; end of line
349                             #((
350                                left-edge
351                                ambitus
352                                breathing-sign
353                                clef
354                                staff-bar
355                                key-cancellation
356                                key-signature
357                                time-signature
358                                custos)
359
360                               ;; unbroken
361                               (
362                                left-edge
363                                ambitus
364                                breathing-sign
365                                clef
366                                staff-bar
367                                key-cancellation
368                                key-signature
369                                staff
370                                time-signature custos)
371
372                               ;; begin of line
373                               (
374                                left-edge
375                                ambitus
376                                breathing-sign
377                                clef
378                                key-cancellation
379                                key-signature
380                                staff-bar
381                                time-signature
382                                custos)))
383         (axes . (0))
384         (meta . ((class . Item)
385                  (interfaces . (break-alignment-interface
386                                 axis-group-interface))))))
387
388     (BreakAlignGroup
389      . (
390         (axes . (0))
391         (X-extent . ,ly:axis-group-interface::width)
392         (meta . ((class . Item)
393                  (interfaces . (break-aligned-interface
394                                 axis-group-interface))))))
395
396     (BreathingSign
397      . (
398         (break-align-symbol . breathing-sign)
399         (non-musical . #t)
400         (space-alist . (
401                         (ambitus . (extra-space . 2.0))
402                         (custos . (minimum-space . 1.0))
403                         (key-signature . (minimum-space . 1.5))
404                         (time-signature . (minimum-space . 1.5))
405                         (staff-bar . (minimum-space . 1.5))
406                         (clef . (minimum-space . 2.0))
407                         (first-note . (fixed-space . 1.0)) ;huh?
408                         (right-edge . (extra-space . 0.1))))
409         (stencil . ,ly:text-interface::print)
410         (text . ,(make-musicglyph-markup "scripts.rcomma"))
411         (Y-offset . ,ly:breathing-sign::offset-callback)
412         (break-visibility . ,begin-of-line-invisible)
413         (meta . ((class . Item)
414                  (interfaces . (break-aligned-interface
415                                 breathing-sign-interface
416                                 text-interface
417                                 font-interface))))))
418
419     (Clef
420      . (
421         (stencil . ,ly:clef::print)
422         (glyph-name . ,ly:clef::calc-glyph-name)
423         (non-musical . #t)
424         (font-family . music)
425         (break-align-symbol . clef)
426         (break-visibility . ,begin-of-line-visible)
427         (space-alist . ((ambitus . (extra-space . 2.0))
428                         (staff-bar . (extra-space . 0.7))
429                         (key-cancellation . (minimum-space . 3.5))
430                         (key-signature . (minimum-space . 3.5))
431                         (time-signature . (minimum-space . 4.2))
432                         (first-note . (minimum-fixed-space . 5.0))
433                         (next-note . (extra-space . 0.5))
434                         (right-edge . (extra-space . 0.5))))
435         (Y-offset . ,ly:staff-symbol-referencer::callback)
436         (meta . ((class . Item)
437                  (interfaces . (clef-interface
438                                 staff-symbol-referencer-interface
439                                 font-interface
440                                 break-aligned-interface))))))
441
442     (ClusterSpannerBeacon
443      . (
444         (Y-extent . ,ly:cluster-beacon::height)
445         (meta . ((class . Item)
446                  (interfaces . (cluster-beacon-interface))))))
447
448     (ClusterSpanner
449      . (
450         (springs-and-rods . ,ly:spanner::set-spacing-rods)
451         (stencil . ,ly:cluster::print)
452         (minimum-length . 0.0)
453         (padding . 0.25)
454         (style . ramp)
455         (meta . ((class . Spanner)
456                  (interfaces . (cluster-interface))))))
457
458     (ChordName
459      . (
460         (stencil . ,ly:text-interface::print)
461         (after-line-breaking . ,ly:chord-name::after-line-breaking)
462         (word-space . 0.0)
463         (font-family . sans)
464         (font-size . 1.5)
465         (meta . ((class . Item)
466                  (interfaces . (font-interface
467                                 rhythmic-grob-interface
468                                 text-interface
469                                 chord-name-interface
470                                 item-interface))))))
471
472     (CombineTextScript
473      . (
474         (stencil . ,ly:text-interface::print)
475         (no-spacing-rods . #t)
476         (Y-offset . ,ly:side-position-interface::y-aligned-side)
477         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
478         (direction . ,UP)
479         (padding . 0.5)
480         (staff-padding . 0.5)
481         (script-priority . 200)
482         ;; todo: add X self alignment?
483         (baseline-skip . 2)
484         (side-axis . ,Y)
485         (font-series . bold)
486         (meta . ((class . Item)
487                  (interfaces . (text-script-interface
488                                 text-interface
489                                 side-position-interface
490                                 font-interface))))))
491
492     (Custos
493      . (
494         (break-align-symbol . custos)
495         (non-musical . #t)
496         (stencil . ,ly:custos::print)
497         (break-visibility . ,end-of-line-visible)
498         (style . vaticana)
499         (neutral-direction . ,DOWN)
500         (Y-offset . ,ly:staff-symbol-referencer::callback)
501         (space-alist . (
502                         (first-note . (minimum-fixed-space . 0.0))
503                         (right-edge . (extra-space . 0.1))))
504         (meta . ((class . Item)
505                  (interfaces
506                   . (custos-interface
507                      staff-symbol-referencer-interface
508                      font-interface
509                      break-aligned-interface))))))
510
511     (DotColumn
512      . (
513         (axes . (0))
514         (direction . ,RIGHT)
515         (positioning-done . ,ly:dot-column::calc-positioning-done) 
516         (X-extent . ,ly:axis-group-interface::width)
517         (X-offset . ,ly:dot-column::side-position)
518         (meta . ((class . Item)
519                  (interfaces . (dot-column-interface
520                                 axis-group-interface))))))
521
522     (Dots
523      . (
524         (stencil . ,ly:dots::print)
525         (dot-count . ,dots::calc-dot-count)
526         (meta . ((class . Item)
527                  (interfaces . (font-interface
528                                 staff-symbol-referencer-interface
529                                 dots-interface))))))
530
531     (DoublePercentRepeat
532      . (
533         (stencil . ,ly:percent-repeat-item-interface::double-percent)
534         (non-musical . #t)
535         (slope . 1.0)
536         (font-encoding . fetaMusic)
537         (width . 2.0)
538         (thickness . 0.48)
539         (break-align-symbol . staff-bar)
540         (break-visibility . ,begin-of-line-invisible)
541         (meta . ((class . Item)
542                  (interfaces . (font-interface
543                                 break-aligned-interface
544                                 percent-repeat-interface))))))
545
546     (DoublePercentRepeatCounter
547      . (
548         (stencil . ,ly:text-interface::print)
549         (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-y-parent))
550                                                   ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
551         (Y-offset . ,ly:side-position-interface::y-aligned-side)
552         (font-encoding . fetaNumber)
553         (self-alignment-X . 0)
554         (font-size . -2) 
555         (direction . ,UP)
556         (padding . 0.2)
557         (staff-padding . 0.25)
558         (side-axis . ,Y)
559         (meta . ((class . Item)
560                  (interfaces . (side-position-interface
561                                 self-alignment-interface
562                                 percent-repeat-interface
563                                 font-interface
564                                 text-interface))))))
565     (DynamicLineSpanner
566      . (
567         (axes . (1))
568         (Y-offset . ,ly:side-position-interface::y-aligned-side)
569         (staff-padding . 0.1)
570         (padding . 0.6)
571         (avoid-slur . outside)
572         (slur-padding . 0.3)
573         (minimum-space . 1.2)
574         (direction . ,DOWN)
575         (side-axis . ,Y)
576         (Y-extent . ,ly:axis-group-interface::height)
577         (X-extent . ,ly:axis-group-interface::width)
578         (meta . ((class . Spanner)
579                  (interfaces . (axis-group-interface
580                                 dynamic-interface
581                                 dynamic-line-spanner-interface
582                                 side-position-interface))))))
583
584     (DynamicText
585      . (
586
587         ;; todo.
588
589         (stencil . ,ly:text-interface::print)
590         (direction . ,ly:script-interface::calc-direction)
591
592         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
593         (self-alignment-X . 0)
594         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
595         (self-alignment-Y . 0)
596         (font-series . bold)
597         (font-encoding . fetaDynamic)
598         (font-shape . italic)
599         (avoid-slur . around)
600         (no-spacing-rods . #t)
601         (script-priority . 100)
602         (meta . ((class . Item)
603                  (interfaces . (font-interface
604                                 text-interface
605                                 self-alignment-interface
606                                 dynamic-interface
607                                 script-interface))))))
608
609     (DynamicTextSpanner
610      . (
611         (stencil . ,ly:dynamic-text-spanner::print)
612
613         ;; rather ugh with NCSB
614         ;; (font-series . bold)
615         (font-shape . italic)
616         (style . dashed-line)
617
618         ;; need to blend with dynamic texts.
619         (font-size . 1)
620         (bound-padding . 0.75)
621         (dash-fraction . 0.2)
622         (dash-period . 3.0)
623         (meta . ((class . Spanner)
624                  (interfaces . (font-interface
625                                 text-interface
626                                 line-spanner-interface
627                                 dynamic-interface
628                                 dynamic-text-spanner-interface
629                                 spanner-interface))))))
630
631                                 
632     (Fingering
633      . (
634
635         ;; sync with TextScript (?)
636
637         (padding . 0.5)
638         (avoid-slur . around)
639         (slur-padding . 0.2)
640         (staff-padding . 0.5)
641         (self-alignment-X . 0)
642         (self-alignment-Y . 0)
643         (script-priority . 100)
644
645         (stencil . ,ly:text-interface::print)
646         (direction . ,ly:script-interface::calc-direction)
647         (text . ,fingering::calc-text) 
648         (font-encoding . fetaNumber)
649         (font-size . -5)                ; don't overlap when next to heads.
650         (meta . ((class . Item)
651                  (interfaces . (finger-interface
652                                 font-interface
653                                 text-script-interface
654                                 text-interface
655                                 side-position-interface
656                                 self-alignment-interface
657                                 item-interface))))))
658     (FretBoard
659      . ((stencil . ,fret-board::calc-stencil)
660         (finger-code . below-string)
661         (meta . ((class . Item)
662                  (interfaces . (fret-diagram-interface
663                                 font-interface
664                                 ))))
665               ))
666     (Glissando
667      . (
668         (style . line)
669         (gap . 0.5)
670         (zigzag-width . 0.75)
671         (non-musical . #t)
672         (X-extent . #f)
673         (Y-extent . #f)
674         (stencil . ,ly:line-spanner::print)
675         (after-line-breaking . ,ly:line-spanner::after-line-breaking)
676         (meta . ((class . Spanner)
677                  (interfaces . (line-interface
678                                 line-spanner-interface))))))
679
680     (GraceSpacing
681      . (
682         (common-shortest-duration . ,grace-spacing::calc-shortest-duration)
683         (spacing-increment . 0.8)
684         (shortest-duration-space . 1.6)
685         (meta . ((class . Spanner)
686                  (interfaces . (grace-spacing-interface
687                                 spacing-interface
688                                 spacing-options-interface
689                                 spanner-interface))))))
690     (GridPoint
691      . (
692         (X-extent . (0 . 0))
693         (Y-extent . (0 . 0))
694         (meta . ((class . Item)
695                  (interfaces . (grid-point-interface))))))
696
697     (GridLine
698      . (
699         (X-extent  . ,ly:grid-line-interface::width)
700         (stencil . ,ly:grid-line-interface::print)
701         (self-alignment-X . ,CENTER)
702         (X-offset . ,(ly:make-simple-closure
703                       `(,+  ,(ly:make-simple-closure
704                               (list ly:self-alignment-interface::centered-on-x-parent))
705                             ,(ly:make-simple-closure
706                               (list ly:self-alignment-interface::x-aligned-on-self)))))
707         (layer . 0)
708         (meta . ((class . Item)
709                  (interfaces . (self-alignment-interface
710                                 grid-line-interface))))))
711
712     (Hairpin
713      . (
714         (stencil . ,ly:hairpin::print)
715         (springs-and-rods . ,ly:spanner::set-spacing-rods)
716         (after-line-breaking . ,ly:hairpin::after-line-breaking)
717         (grow-direction . ,hairpin::calc-grow-direction)
718         (circled-tip . #f)
719         (thickness . 1.0)
720         (height . 0.6666)
721         (minimum-length . 2.0)
722         (bound-padding . 1.0)
723         (self-alignment-Y . 0)
724         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
725         (meta . ((class . Spanner)
726                  (interfaces . (hairpin-interface
727                                 line-interface
728                                 self-alignment-interface
729                                 dynamic-interface
730                                 spanner-interface))))))
731
732     (HorizontalBracket
733      . (
734         (thickness . 1.0)
735         (stencil . ,ly:horizontal-bracket::print)
736         (Y-offset . ,ly:side-position-interface::y-aligned-side)
737         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
738         
739         (padding . 0.2)
740         (staff-padding . 0.2)
741         (direction . ,DOWN)
742         (side-axis . ,Y)
743         (bracket-flare . (0.5 . 0.5))
744         (meta . ((class . Spanner)
745                  (interfaces . (horizontal-bracket-interface
746                                 side-position-interface
747                                 line-interface
748                                 spanner-interface))))))
749     (InstrumentName
750      . (
751         (padding . 0.3)
752         (stencil . ,ly:system-start-text::print)
753         (X-offset . ,ly:side-position-interface::x-aligned-side)
754         (direction . ,LEFT)
755         (self-alignment-Y . ,CENTER)
756         (meta . ((class . Spanner)
757                  (interfaces . (system-start-text-interface
758                                 side-position-interface
759                                 font-interface))))))
760
761     (InstrumentSwitch
762      . (
763         (padding . 0.3)
764         (stencil . ,ly:text-interface::print)
765         (Y-offset . ,ly:side-position-interface::y-aligned-side)
766         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
767         (staff-padding . 2)
768         (direction . ,UP)
769         (self-alignment-X . ,CENTER)
770         (meta . ((class . Item)
771                  (interfaces . (system-start-text-interface
772                                 side-position-interface
773                                 font-interface))))))
774     
775     (KeyCancellation
776      . (
777         (stencil . ,ly:key-signature-interface::print)
778         (space-alist . (
779                         (time-signature . (extra-space . 1.25))
780                         (staff-bar . (extra-space . 0.6))
781                         (key-signature . (extra-space . 0.5))
782                         (right-edge . (extra-space . 0.5))
783                         (first-note . (fixed-space . 2.5))))
784         (Y-offset . ,ly:staff-symbol-referencer::callback)
785         (break-align-symbol . key-cancellation)
786         (break-visibility . ,begin-of-line-invisible)
787         (non-musical . #t)
788         (meta . ((class . Item)
789                  (interfaces . (key-signature-interface
790                                 font-interface
791                                 break-aligned-interface))))))
792     (KeySignature
793      . (
794         (stencil . ,ly:key-signature-interface::print)
795         (space-alist . (
796                         (time-signature . (extra-space . 1.15))
797                         (staff-bar . (extra-space . 1.1))
798                         (right-edge . (extra-space . 0.5))
799                         (first-note . (fixed-space . 2.5))))
800         (Y-offset . ,ly:staff-symbol-referencer::callback)
801         (break-align-symbol . key-signature)
802         (break-visibility . ,begin-of-line-visible)
803         (non-musical . #t)
804         (meta . ((class . Item)
805                  (interfaces . (key-signature-interface
806                                 font-interface
807                                 break-aligned-interface))))))
808     
809     
810    (LaissezVibrerTie
811      . (
812         (stencil  . ,ly:tie::print)
813         (control-points . ,ly:semi-tie::calc-control-points)
814         (direction . ,ly:tie::calc-direction)
815         (details . ((ratio . 0.333)
816                     (height-limit . 1.0)))
817         (head-direction . ,LEFT)
818         (thickness . 1.0)
819         (meta . ((class . Item)
820                  (interfaces . (semi-tie-interface))
821                  ))
822         ))
823
824     (LaissezVibrerTieColumn
825      . (
826         (X-extent . #f)
827         (Y-extent . #f)
828         (head-direction . ,LEFT)
829         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
830         (meta . ((class . Item)
831                  (interfaces . (semi-tie-column-interface))
832                  ))
833         ))
834
835     (LedgerLineSpanner
836      . (
837         (springs-and-rods . ,ly:ledger-line-spanner::set-spacing-rods)
838         (stencil . ,ly:ledger-line-spanner::print)
839         (X-extent . #f)
840         (Y-extent . #f)
841         (minimum-length-fraction . 0.25)
842         (length-fraction . 0.25)
843         (layer . 0)
844         (meta . ((class . Spanner)
845                  (interfaces . (ledger-line-interface))))))
846
847     (LeftEdge
848      . (
849         (break-align-symbol . left-edge)
850         (X-extent . (0 . 0))
851         (non-musical . #t)
852         (break-visibility . ,center-invisible)
853         (space-alist . (
854                         (custos . (extra-space . 0.0))
855                         (ambitus . (extra-space . 2.0))
856                         (time-signature . (extra-space . 1.0))
857                         (staff-bar . (extra-space . 0.0))
858                         (breathing-sign . (minimum-space . 0.0))
859                         (clef . (extra-space . 0.8))
860                         (first-note . (fixed-space . 2.0))
861                         (right-edge . (extra-space . 0.0))
862                         (key-signature . (extra-space . 0.0))
863                         (key-cancellation . (extra-space . 0.0))
864                         ))
865         (meta . ((class . Item)
866                  (interfaces . (break-aligned-interface))))))
867
868     (LigatureBracket
869      . (
870         ;; ugh.  A ligature bracket is totally different from
871         ;; a tuplet bracket.
872
873         (padding . 2.0)
874         (thickness . 1.6)
875         (edge-height . (0.7 . 0.7))
876         (shorten-pair . (-0.2 . -0.2))
877         (direction . ,UP)
878         (positions . ,ly:tuplet-bracket::calc-positions)
879         (stencil . ,ly:tuplet-bracket::print)
880         (staff-padding . 0.25)
881         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
882         (control-points . ,ly:tuplet-bracket::calc-control-points)
883         (meta . ((class . Spanner)
884                  (interfaces . (line-interface
885                                 tuplet-bracket-interface))))))
886
887
888     (LyricExtender
889      . (
890         (stencil . ,ly:lyric-extender::print)
891         (thickness . 0.8) ; line-thickness
892         (minimum-length . 1.5)
893         (Y-extent . (0 . 0))
894         (meta . ((class . Spanner)
895                  (interfaces . (lyric-interface
896                                 lyric-extender-interface))))))
897
898     (LyricHyphen
899      . (
900         (thickness . 1.3)
901         (height . 0.42)
902         (dash-period . 10.0)
903         (length . 0.66)
904         (minimum-length . 0.3)
905         (minimum-distance . 0.1)
906         (padding . 0.07)
907         (springs-and-rods . ,ly:hyphen-spanner::set-spacing-rods)
908         (stencil . ,ly:hyphen-spanner::print)
909         (Y-extent . (0 . 0))
910         (meta . ((class . Spanner)
911                  (interfaces . (lyric-interface
912                                 font-interface
913                                 lyric-hyphen-interface
914                                 spanner-interface))))))
915
916     (LyricSpace
917      . ((minimum-distance . 0.45)
918         (springs-and-rods . ,ly:hyphen-spanner::set-spacing-rods)
919         (padding . 0.0)
920         (Y-extent . #f)
921         (X-extent . #f)
922         (meta . ((class . Spanner)
923                  (interfaces . (spanner-interface
924                                 lyric-hyphen-interface spacing-interface))
925                  ))
926         ))
927     
928     (LyricText
929      . (
930         (stencil . ,lyric-text::print)
931         (text . ,(grob::calc-property-by-copy 'text)) 
932         (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent)
933         (self-alignment-X . 0)
934         (word-space . 0.6)
935         (font-series . bold-narrow)
936         (font-size . 1.0)
937         (meta . ((class . Item)
938                  (interfaces . (rhythmic-grob-interface
939                                 lyric-syllable-interface
940                                 self-alignment-interface
941                                 text-interface
942                                 font-interface))))))
943
944
945     (MeasureGrouping
946      . (
947         (Y-offset . ,ly:side-position-interface::y-aligned-side)
948         (side-axis . ,Y)
949         (stencil . ,ly:measure-grouping::print)
950         (padding . 2)
951         (direction . ,UP)
952         (thickness . 1)
953         (height . 2.0)
954         (staff-padding . 3)
955         (meta . ((class . Spanner)
956                  (interfaces . (side-position-interface
957                                 measure-grouping-interface))))))
958
959     (MelodyItem
960      . (
961         (neutral-direction . ,DOWN)
962         (meta . ((class . Item)
963                  (interfaces . (melody-spanner-interface spacing-interface))))))
964     (MensuralLigature
965      . (
966         (thickness . 1.4)
967         (flexa-width . 2.0)
968         (stencil . ,ly:mensural-ligature::print)
969         (meta . ((class . Spanner)
970                  (interfaces . (mensural-ligature-interface
971                                 font-interface))))))
972
973     (MetronomeMark
974      . (
975         (stencil . ,ly:text-interface::print)
976         (Y-offset . ,ly:side-position-interface::y-aligned-side)
977         (direction . ,UP)
978         (padding . 0.8)
979         (side-axis . ,Y)
980         (meta . ((class . Item)
981                  (interfaces . (text-interface
982                                 side-position-interface
983                                 font-interface
984                                 metronome-mark-interface))))))
985
986
987     (MultiMeasureRest
988      . (
989         (stencil . ,ly:multi-measure-rest::print)
990         (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
991         (Y-offset . ,ly:staff-symbol-referencer::callback)
992         (staff-position . 0)
993         (expand-limit . 10)
994         (thick-thickness . 6.6)
995         (hair-thickness . 2.0)
996         (padding . 1)
997         (meta . ((class . Spanner)
998                  (interfaces . (multi-measure-rest-interface
999                                 multi-measure-interface
1000                                 rest-interface
1001                                 font-interface
1002                                 staff-symbol-referencer-interface))))))
1003
1004
1005     (MultiMeasureRestNumber
1006      . (
1007         (bound-padding  . 2.0)
1008         (springs-and-rods . ,ly:multi-measure-rest::set-text-rods)
1009         (stencil . ,ly:text-interface::print)
1010         (X-offset . ,(ly:make-simple-closure
1011                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))
1012                            ,(ly:make-simple-closure (list ly:self-alignment-interface::x-centered-on-y-parent)))))
1013         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1014         (side-axis . ,Y)
1015         (self-alignment-X . 0)
1016         (direction . ,UP)
1017         (padding . 0.4)
1018         (staff-padding . 0.4)
1019         (font-encoding . fetaNumber)
1020         (meta . ((class . Spanner)
1021                  (interfaces . (side-position-interface
1022                                 multi-measure-interface
1023                                 self-alignment-interface
1024                                 font-interface
1025                                 text-interface))))
1026               ))
1027
1028     (MultiMeasureRestText
1029      . (
1030         (stencil . ,ly:text-interface::print)
1031         (X-offset . ,(ly:make-simple-closure
1032                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-centered-on-y-parent))
1033                            ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
1034         
1035         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1036         (self-alignment-X . 0)
1037         (direction . ,UP)
1038         (padding . 0.2)
1039         (staff-padding . 0.25)
1040         (meta . ((class . Spanner)
1041                  (interfaces . (side-position-interface
1042                                 multi-measure-interface
1043                                 self-alignment-interface
1044                                 font-interface
1045                                 text-interface))))))
1046
1047     (NonMusicalPaperColumn
1048      . (
1049         (allow-loose-spacing . #t)
1050         (axes . (0))
1051         (before-line-breaking . ,ly:paper-column::before-line-breaking)
1052         (X-extent . ,ly:axis-group-interface::width)
1053         ;;                    (stencil . ,ly:paper-column::print)
1054         
1055         (non-musical . #t)
1056         (line-break-permission . allow)
1057         (page-break-permission . allow)
1058
1059         ;; debugging stuff: print column number.
1060         ;;               (font-size . -6) (font-name . "sans")  (Y-extent . #f)
1061
1062         (meta . ((class . Paper_column)
1063                  (interfaces . (paper-column-interface
1064                                 axis-group-interface
1065                                 spaceable-grob-interface))))))
1066     
1067     (NoteCollision
1068      . (
1069         (axes . (0 1))
1070         (X-extent . ,ly:axis-group-interface::width)
1071         (Y-extent . ,ly:axis-group-interface::height)
1072         (positioning-done . ,ly:note-collision-interface::calc-positioning-done)
1073         (meta . ((class . Item)
1074                  (interfaces . (note-collision-interface
1075                                 axis-group-interface))))))
1076
1077     (NoteColumn
1078      . (
1079         (axes . (0 1))
1080         (X-extent . ,ly:axis-group-interface::width)
1081         (Y-extent . ,ly:axis-group-interface::height)
1082         (meta . ((class . Item)
1083                  (interfaces . (axis-group-interface
1084                                 note-column-interface))))))
1085
1086     (NoteHead
1087      . (
1088         (stencil . ,ly:note-head::print)
1089         (duration-log . ,note-head::calc-duration-log)
1090         (stem-attachment . ,ly:note-head::calc-stem-attachment)
1091         (glyph-name . ,note-head::calc-glyph-name) 
1092         (Y-offset . ,ly:staff-symbol-referencer::callback)
1093         (X-offset . ,ly:note-head::stem-x-shift)
1094         (meta . ((class . Item)
1095                  (interfaces . (rhythmic-grob-interface
1096                                 rhythmic-head-interface
1097                                 font-interface
1098                                 note-head-interface
1099                                 ledgered-interface
1100                                 staff-symbol-referencer-interface))))))
1101
1102     (NoteSpacing
1103      . (
1104         (stem-spacing-correction . 0.5)
1105         (same-direction-correction . 0.25)
1106         ;; Changed this from 0.75.
1107         ;; If you ever change this back, please document! --hwn
1108         (knee-spacing-correction . 1.0)
1109         (meta . ((class . Item)
1110                  (interfaces . (spacing-interface
1111                                 note-spacing-interface))))))
1112
1113     (NoteName
1114      . (
1115         (stencil . ,ly:text-interface::print)
1116         (meta . ((class . Item)
1117                  (interfaces . (note-name-interface
1118                                 text-interface
1119                                 font-interface))))))
1120
1121     (OctavateEight
1122      . (
1123         (self-alignment-X . 0)
1124         (break-visibility . ,begin-of-line-visible)
1125         (X-offset . ,(ly:make-simple-closure
1126                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))
1127                            ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent)))))
1128         
1129         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1130         (stencil . ,ly:text-interface::print)
1131
1132         ;; no Y dimensions, because of lyrics under tenor clef.
1133         (Y-extent . (0 . 0))
1134         (font-shape . italic)
1135         (padding . 0.6)
1136         (staff-padding . 0.2)
1137         (font-size . -4)
1138         (meta . ((class . Item)
1139                  (interfaces . (text-interface
1140                                 self-alignment-interface
1141                                 side-position-interface
1142                                 font-interface))))))
1143
1144     (OttavaBracket
1145      . (
1146         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1147         (stencil . ,ly:ottava-bracket::print)
1148         (font-shape . italic)
1149         (shorten-pair . (0.0 . -0.6))
1150         (staff-padding . 1.0)
1151         (padding . 0.5)
1152         (minimum-length . 1.0)
1153         (dash-fraction . 0.3)
1154         (edge-height . (0 . 1.2))
1155         (direction . ,UP)
1156         (meta . ((class . Spanner)
1157                  (interfaces . (ottava-bracket-interface
1158                                 horizontal-bracket-interface
1159                                 line-interface
1160                                 side-position-interface
1161                                 font-interface
1162                                 text-interface))))))
1163
1164     (PaperColumn
1165      . (
1166         (axes . (0))
1167         (allow-loose-spacing . #t)
1168         (before-line-breaking . ,ly:paper-column::before-line-breaking)
1169         ;; (stencil . ,ly:paper-column::print)
1170         (X-extent . ,ly:axis-group-interface::width)
1171         
1172         ;; debugging
1173         ;;                       (font-size . -6) (font-name . "sans") (Y-extent . #f)
1174         (meta . ((class . Paper_column)
1175                  (interfaces . (paper-column-interface
1176                                 axis-group-interface
1177                                 spaceable-grob-interface))))))
1178
1179     (ParenthesesItem
1180      . ((stencil . ,parentheses-item::print)
1181         (font-size . -6)
1182         (padding . 0.2)
1183         (meta . ((class . Item)
1184                  (interfaces . (parentheses-interface font-interface))))
1185         ))
1186     
1187     (PhrasingSlur
1188      . ((details . ,default-slur-details)
1189         (control-points . ,ly:slur::calc-control-points)
1190         (direction . ,ly:slur::calc-direction)
1191         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1192         (Y-extent . ,ly:slur::height)
1193         (stencil . ,ly:slur::print)                   
1194         (thickness . 1.1)
1195         (minimum-length . 1.5)
1196         (height-limit . 2.0)
1197         (ratio . 0.333)
1198         (meta . ((class . Spanner)
1199                  (interfaces . (slur-interface))))))
1200
1201
1202
1203     (PercentRepeat
1204      . (
1205         (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
1206         (stencil . ,ly:multi-measure-rest::percent)
1207         (slope . 1.0)
1208         (thickness . 0.48)
1209         (font-encoding . fetaMusic)
1210         (meta . ((class . Spanner)
1211                  (interfaces . (multi-measure-rest-interface
1212                                 font-interface
1213                                 percent-repeat-interface))))))
1214     (PercentRepeatCounter
1215      . (
1216         (stencil . ,ly:text-interface::print)
1217         (X-offset . ,(ly:make-simple-closure
1218                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-centered-on-y-parent))
1219                            ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
1220         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1221         (self-alignment-X . 0)
1222         (direction . ,UP)
1223         (padding . 0.2)
1224         (staff-padding . 0.25)
1225         (font-size . -2) 
1226         (font-encoding . fetaNumber)
1227         (meta . ((class . Spanner)
1228                  (interfaces . (side-position-interface
1229                                 self-alignment-interface
1230                                 percent-repeat-interface
1231                                 font-interface
1232                                 text-interface))))))
1233
1234     ;; an example of a text spanner
1235     (PianoPedalBracket
1236      . (
1237         (stencil . ,ly:piano-pedal-bracket::print)
1238         (style . line)
1239         (bound-padding . 1.0)
1240         (direction . ,DOWN)
1241         (bracket-flare . (0.5 . 0.5))
1242         (edge-height . (1.0 . 1.0))
1243         (shorten-pair . (0.0 . 0.0))
1244         (thickness .  1.0)
1245         (meta . ((class . Spanner)
1246                  (interfaces . (line-interface
1247                                 piano-pedal-interface
1248                                 piano-pedal-bracket-interface))))))
1249
1250     (RehearsalMark
1251      . (
1252         (stencil . ,ly:text-interface::print)
1253         (X-offset . ,(ly:make-simple-closure
1254                       `(,+
1255                         ,(ly:make-simple-closure
1256                           (list ly:break-alignment-align-interface::self-align-callback))
1257                         ,(ly:make-simple-closure
1258                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1259
1260         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1261         (self-alignment-X . 0)
1262         (direction . ,UP)
1263         (non-musical . #t)
1264         (font-size . 2)
1265         (baseline-skip . 2)
1266         (break-visibility . ,end-of-line-invisible)
1267         (break-align-symbol . staff-bar)
1268         (padding . 0.8)
1269         (meta . ((class . Item)
1270                  (interfaces . (text-interface
1271                                 side-position-interface
1272                                 break-alignment-align-interface
1273                                 font-interface
1274                                 mark-interface
1275                                 self-alignment-interface))))))
1276
1277     (RepeatSlash
1278      . (
1279         (stencil . ,ly:percent-repeat-item-interface::beat-slash)
1280         (thickness . 0.48)
1281         (slope . 1.7)
1282         (meta . ((class . Item)
1283                  (interfaces . (percent-repeat-interface))))))
1284
1285     (RepeatTie
1286      . (
1287         (stencil  . ,ly:tie::print)
1288         (control-points . ,ly:semi-tie::calc-control-points)
1289         (direction . ,ly:tie::calc-direction)
1290         (details . ((ratio . 0.333)
1291                     (height-limit . 1.0)))
1292         (thickness . 1.0)
1293         (head-direction . ,RIGHT)
1294         (meta . ((class . Item)
1295                  (interfaces . (semi-tie-interface))
1296                  ))
1297         ))
1298
1299     (RepeatTieColumn
1300      . (
1301         (X-extent . #f)
1302         (Y-extent . #f)
1303         (direction . ,ly:tie::calc-direction)
1304         (head-direction . ,RIGHT)
1305         
1306         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
1307         (meta . ((class . Item)
1308                  (interfaces . (semi-tie-column-interface))
1309                  ))
1310         ))
1311
1312     (Rest
1313      . (
1314         (stencil . ,ly:rest::print)
1315         (duration-log . ,stem::calc-duration-log)
1316         (X-extent . ,ly:rest::width)
1317         (Y-extent . ,ly:rest::height)
1318         (Y-offset . ,ly:rest::y-offset-callback)
1319         (minimum-distance . 0.25)
1320         (meta . ((class . Item)
1321                  (interfaces . (font-interface
1322                                 rhythmic-head-interface
1323                                 rhythmic-grob-interface
1324                                 staff-symbol-referencer-interface
1325                                 rest-interface))))))
1326
1327     (RestCollision
1328      . (
1329         (minimum-distance . 0.75)
1330         (positioning-done . ,ly:rest-collision::calc-positioning-done)
1331         (meta . ((class . Item)
1332                  (interfaces . (rest-collision-interface))))))
1333
1334     (Script
1335      . (
1336         ;; don't set direction here: it breaks staccato.
1337
1338         ;; padding set in script definitions.
1339         (staff-padding . 0.25)
1340         ;; (script-priority . 0) priorities for scripts, see script.scm
1341         (X-offset . ,ly:self-alignment-interface::centered-on-x-parent)
1342         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1343         (side-axis . ,Y)
1344
1345         (stencil . ,ly:script-interface::print)
1346         (direction . ,ly:script-interface::calc-direction)
1347         (font-encoding . fetaMusic)
1348         (meta . ((class . Item)
1349                  (interfaces . (script-interface
1350                                 side-position-interface
1351                                 font-interface))))))
1352
1353     (ScriptColumn
1354      . (
1355         (before-line-breaking . ,ly:script-column::before-line-breaking)
1356         (meta . ((class . Item)
1357                  (interfaces . (script-column-interface))))))
1358     (ScriptRow
1359      . (
1360         (before-line-breaking . ,ly:script-column::row-before-line-breaking)
1361         (meta . ((class . Item)
1362                  (interfaces . (script-column-interface))))))
1363
1364     (SeparationItem
1365      . (
1366         (avoid-slur . inside)
1367         (X-extent . ,ly:axis-group-interface::width)
1368         (Y-extent . ,ly:axis-group-interface::height)
1369         (meta . ((class . Item)
1370                  (interfaces . (spacing-interface
1371                                 separation-item-interface))))))
1372
1373     (SeparatingGroupSpanner
1374      . (
1375         (springs-and-rods . ,ly:separating-group-spanner::set-spacing-rods)
1376         (meta . ((class . Spanner)
1377                  (interfaces . (only-prebreak-interface
1378                                 spacing-interface
1379                                 separation-spanner-interface))))))
1380
1381     (Slur
1382      . ((details . ,default-slur-details)
1383         (control-points . ,ly:slur::calc-control-points)
1384         (direction . ,ly:slur::calc-direction)
1385         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1386         (Y-extent . ,ly:slur::height)
1387         (stencil . ,ly:slur::print)
1388         (thickness . 1.2)
1389         (line-thickness . 0.8)
1390         (minimum-length . 1.5)
1391         (height-limit . 2.0)
1392         (ratio . 0.25)
1393         (avoid-slur . inside)
1394         (meta . ((class . Spanner)
1395                  (interfaces . (slur-interface))))))
1396
1397     (SostenutoPedal
1398      . (
1399         (stencil . ,ly:text-interface::print)
1400         (direction . ,RIGHT)
1401         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1402         (no-spacing-rods . #t)
1403         (padding . 0.0) ;; padding relative to SostenutoPedalLineSpanner
1404         (font-shape . italic)
1405         (self-alignment-X . 0)
1406         (meta . ((class . Item)
1407                  (interfaces . (text-interface
1408                                 self-alignment-interface
1409                                 piano-pedal-script-interface
1410                                 font-interface))))))
1411
1412     (SostenutoPedalLineSpanner
1413      . (
1414         (axes . (1))
1415         (Y-extent . ,ly:axis-group-interface::height)
1416         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1417         (side-axis . ,Y)
1418         (staff-padding . 1.0)
1419         (padding . 1.2)
1420         (minimum-space . 1.0)
1421         (direction . ,DOWN)
1422         (meta . ((class . Spanner)
1423                  (interfaces . (piano-pedal-interface
1424                                 axis-group-interface
1425                                 side-position-interface))))))
1426     (SpacingSpanner
1427      . (
1428         (springs-and-rods . ,ly:spacing-spanner::set-springs)
1429         (common-shortest-duration . ,ly:spacing-spanner::calc-common-shortest-duration)
1430         (average-spacing-wishes . #t)
1431         (shortest-duration-space . 2.0)
1432         (spacing-increment . 1.2)
1433         
1434         (base-shortest-duration . ,(ly:make-moment 3 16))
1435         (meta . ((class . Spanner)
1436                  (interfaces . (spacing-interface
1437                                 spacing-options-interface                               
1438                                 spacing-spanner-interface))))))
1439
1440     (SpanBar
1441      . (
1442         (break-align-symbol . staff-bar)
1443         (Y-extent . ())
1444         (layer . 0)
1445         (non-musical . #t)
1446         (stencil . ,ly:span-bar::print)
1447         (bar-size . ,ly:span-bar::calc-bar-size)
1448         (X-extent . ,ly:span-bar::width)
1449         (glyph-name . ,ly:span-bar::calc-glyph-name)
1450         (before-line-breaking . ,ly:span-bar::before-line-breaking)
1451
1452         ;; ugh duplication!
1453
1454         ;;
1455         ;; Ross. page 151 lists other values, we opt for a leaner look
1456         ;;
1457         (kern . 3.0)
1458         (thin-kern . 3.0)
1459         (hair-thickness . 1.6)
1460         (thick-thickness . 6.0)
1461         (meta . ((class . Item)
1462                  (interfaces . (span-bar-interface
1463                                 font-interface
1464                                 bar-line-interface))))))
1465
1466     (StanzaNumber
1467      . (
1468         (stencil . ,ly:text-interface::print)
1469         (font-series . bold)
1470         (padding . 1.0)
1471         (X-offset . ,ly:side-position-interface::x-aligned-side)
1472         (side-axis . ,X)
1473         (direction . ,LEFT)
1474         (meta . ((class . Item)
1475                  (interfaces . (side-position-interface
1476                                 stanza-number-interface
1477                                 text-interface
1478                                 font-interface))))))
1479
1480
1481     (StaffSpacing
1482      . (
1483         (non-musical . #t)
1484         (stem-spacing-correction . 0.4)
1485         (meta . ((class . Item)
1486                  (interfaces . (spacing-interface
1487                                 staff-spacing-interface))))))
1488
1489    
1490     (StaffSymbol
1491      . (
1492         (Y-extent . ,ly:staff-symbol::height)
1493         (stencil . ,ly:staff-symbol::print)
1494         (line-count . 5)
1495         (ledger-line-thickness . (1.0 . 0.1))
1496         (layer . 0)
1497         (meta . ((class . Spanner)
1498                  (interfaces . (staff-symbol-interface))))))
1499
1500     (Stem
1501      . (
1502         (direction . ,ly:stem::calc-direction)
1503         (duration-log . ,stem::calc-duration-log)
1504         (default-direction . ,ly:stem::calc-default-direction)
1505         (stem-end-position . ,ly:stem::calc-stem-end-position)
1506
1507         (neutral-direction . ,DOWN)
1508         (stem-info . ,ly:stem::calc-stem-info)
1509         (positioning-done . ,ly:stem::calc-positioning-done)
1510         (stencil . ,ly:stem::print)
1511         (X-extent . ,ly:stem::width)
1512         (Y-extent . ,ly:stem::height)
1513         (length . ,ly:stem::calc-length)
1514         (thickness . 1.3)
1515         (details
1516          . (
1517             ;; 3.5 (or 3 measured from note head) is standard length
1518             ;; 32nd, 64th flagged stems should be longer
1519             (lengths . (3.5 3.5 3.5 4.5 5.0))
1520
1521             ;; FIXME.  3.5 yields too long beams (according to Ross and
1522             ;; looking at Baerenreiter examples) for a number of common
1523             ;; boundary cases.  Subtracting half a beam thickness fixes
1524             ;; this, but the bug may well be somewhere else.
1525
1526             ;; FIXME this should come from 'lengths
1527             (beamed-lengths . (3.26 3.5 3.6))
1528
1529             ;; The 'normal' minima
1530             (beamed-minimum-free-lengths . (1.83 1.5 1.25))
1531                                         ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
1532
1533             ;; The 'extreme case' minima
1534             (beamed-extreme-minimum-free-lengths . (2.0 1.25))
1535
1536             ;; Stems in unnatural (forced) direction should be shortened by
1537             ;; one staff space, according to [Roush & Gourlay].
1538             ;; Flagged stems we shorten only half a staff space.
1539             (stem-shorten . (1.0 0.5))
1540
1541             ))
1542
1543         ;; We use the normal minima as minimum for the ideal lengths,
1544         ;; and the extreme minima as abolute minimum length.
1545
1546         (X-offset . ,ly:stem::offset-callback)
1547         (Y-offset . ,ly:staff-symbol-referencer::callback)
1548         (meta . ((class . Item)
1549                  (interfaces . (stem-interface
1550                                 font-interface))))))
1551
1552     (StemTremolo
1553      . (
1554         (Y-extent . ,ly:stem-tremolo::height)
1555         (stencil . ,ly:stem-tremolo::print)
1556         (X-extent . #f)
1557         (slope . ,ly:stem-tremolo::calc-slope)
1558         (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space
1559         (style . ,ly:stem-tremolo::calc-style)
1560         (beam-thickness . 0.48) ; staff-space
1561         (meta . ((class . Item)
1562                  (interfaces . (stem-tremolo-interface))))))
1563
1564     (StringNumber
1565      . (
1566         (stencil . ,print-circled-text-callback)
1567         (text . ,string-number::calc-text)
1568         (padding . 0.5)
1569         (staff-padding . 0.5)
1570         (self-alignment-X . 0)
1571         (self-alignment-Y . 0)
1572         (script-priority . 100)
1573         (font-encoding . fetaNumber)
1574         (font-size . -5)                ; don't overlap when next to heads.
1575         (meta . ((class . Item)
1576                  (interfaces . (string-number-interface
1577                                 font-interface
1578                                 text-script-interface
1579                                 text-interface
1580                                 side-position-interface
1581                                 self-alignment-interface
1582                                 item-interface))))))
1583     
1584     (StrokeFinger
1585      . (
1586         (stencil . ,ly:text-interface::print)
1587         (text . ,stroke-finger::calc-text)
1588         (digit-names . #("p" "i" "m" "a" "x"))
1589         (padding . 0.5)
1590         (staff-padding . 0.5)
1591         (self-alignment-X . 0)
1592         (self-alignment-Y . 0)
1593         (script-priority . 100)
1594         (font-shape . italic)
1595         (font-size . -4)                ; don't overlap when next to heads.
1596         (meta . ((class . Item)
1597                  (interfaces . (stroke-finger-interface
1598                                 font-interface
1599                                 text-script-interface
1600                                 text-interface
1601                                 side-position-interface
1602                                 self-alignment-interface
1603                                 item-interface))))))
1604     
1605
1606     (SustainPedal
1607      . (
1608         (no-spacing-rods . #t)
1609         (stencil . ,ly:sustain-pedal::print)
1610         (self-alignment-X . 0)
1611         (direction . ,RIGHT)
1612         (padding . 0.0)  ;; padding relative to SustainPedalLineSpanner
1613         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1614         (meta . ((class . Item)
1615                  (interfaces . (piano-pedal-interface
1616                                 text-spanner-interface
1617                                 line-spanner-interface
1618                                 text-interface
1619                                 self-alignment-interface
1620                                 piano-pedal-script-interface
1621                                 font-interface))))))
1622
1623     (SustainPedalLineSpanner
1624      . (
1625         (axes . (1))
1626         (Y-extent . ,ly:axis-group-interface::height)
1627         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1628         (side-axis . ,Y)
1629         (padding . 1.2)
1630         (staff-padding . 1.2)
1631         (minimum-space . 1.0)
1632         (direction . ,DOWN)
1633         (meta . ((class . Spanner)
1634                  (interfaces . (piano-pedal-interface
1635                                 axis-group-interface
1636                                 side-position-interface))))))
1637
1638     (System
1639      . (
1640         (axes . (0 1))
1641         (X-extent . ,ly:axis-group-interface::width)
1642         (Y-extent . ,ly:axis-group-interface::height)
1643         (meta . ((class . System)
1644                  (interfaces . (system-interface
1645                                 axis-group-interface))))))
1646
1647     (SystemStartBrace
1648      . (
1649         (style . brace)
1650         (padding . 0.3)
1651         (stencil . ,ly:system-start-delimiter::print)
1652         (collapse-height . 5.0)
1653         (X-offset . ,ly:side-position-interface::x-aligned-side)
1654         (direction . ,LEFT)
1655         (font-encoding . fetaBraces)
1656         (Y-extent . #f)
1657         (meta . ((class . Spanner)
1658                  (interfaces . (system-start-delimiter-interface
1659                                 side-position-interface
1660                                 font-interface))))))
1661
1662
1663     (SystemStartSquare
1664      . (
1665         (Y-extent . #f)
1666         (X-offset . ,ly:side-position-interface::x-aligned-side)
1667         (direction . ,LEFT)
1668         (stencil . ,ly:system-start-delimiter::print)
1669         (style . line-bracket)
1670         (thickness . 1.0)
1671         (meta . ((class . Spanner)
1672                  (interfaces . (font-interface
1673                                 side-position-interface
1674                                 system-start-delimiter-interface))))))
1675     (SystemStartBracket
1676      . (
1677         (Y-extent . #f)
1678         (padding . 0.8)
1679         (X-offset . ,ly:side-position-interface::x-aligned-side)
1680         (direction . ,LEFT)
1681         (stencil . ,ly:system-start-delimiter::print)
1682         (style . bracket)
1683         (collapse-height . 5.0)
1684         (thickness . 0.45)
1685         (meta . ((class . Spanner)
1686                  (interfaces . (font-interface
1687                                 side-position-interface
1688                                 system-start-delimiter-interface))))))
1689
1690     (SystemStartBar
1691      . (
1692         (Y-extent . #f)
1693
1694         ;; ugh--hardcoded. 
1695         (padding . -0.1)  ;; bar must cover rounded ending of staff line.
1696         (X-offset . ,ly:side-position-interface::x-aligned-side)
1697         (direction . ,LEFT)
1698         (style . bar-line)
1699         (thickness . 1.6)
1700         (stencil . ,ly:system-start-delimiter::print)
1701         (meta . ((class . Spanner)
1702                  (interfaces . (side-position-interface
1703                                 system-start-delimiter-interface))))))
1704
1705
1706     (TabNoteHead
1707      . (
1708         (stencil . ,ly:text-interface::print)
1709         (Y-offset . ,ly:staff-symbol-referencer::callback)
1710         (font-size . -2)
1711         (stem-attachment . (0.0 . 1.35))
1712         (font-series . bold)
1713         (meta . ((class . Item)
1714                  (interfaces
1715                   . (rhythmic-head-interface
1716                      font-interface rhythmic-grob-interface
1717                      note-head-interface
1718                      staff-symbol-referencer-interface
1719                      text-interface))))))
1720
1721     (TextScript
1722      . (
1723         (no-spacing-rods . #t)
1724         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1725         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1726         (side-axis . ,Y)
1727         (direction . ,DOWN)
1728
1729         ;; sync with Fingering ?
1730         (padding . 0.5)
1731         (staff-padding . 0.5)
1732
1733         (stencil . ,ly:text-interface::print)
1734         (direction . ,ly:script-interface::calc-direction)
1735
1736         (avoid-slur . around)
1737         (slur-padding . 0.5)
1738         (script-priority . 200)
1739         ;; todo: add X self alignment?
1740         (meta . ((class . Item)
1741                  (interfaces . (text-script-interface
1742                                 text-interface
1743                                 side-position-interface
1744                                 font-interface))))))
1745
1746     (TextSpanner
1747      . (
1748         (stencil . ,ly:text-spanner::print)
1749         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1750         (font-shape . italic)
1751         (style . dashed-line)
1752         (staff-padding . 0.8)
1753         (dash-fraction . 0.2)
1754         (dash-period . 3.0)
1755         (side-axis . ,Y)
1756         (direction . ,UP)
1757         (meta . ((class . Spanner)
1758                  (interfaces . (text-spanner-interface
1759                                 line-spanner-interface
1760                                 side-position-interface
1761                                 font-interface))))))
1762
1763     (Tie
1764      . (
1765         (control-points . ,ly:tie::calc-control-points)
1766         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1767         (avoid-slur . inside)
1768         (direction . ,ly:tie::calc-direction)
1769         (stencil . ,ly:tie::print)
1770         (font-size . -6)
1771         (details . (
1772                     ;; for a full list, see tie-helper.cc
1773                     (ratio . 0.333)
1774                     (center-staff-line-clearance . 0.6)
1775                     (tip-staff-line-clearance . 0.45)
1776                     (note-head-gap . 0.2)
1777                     (stem-gap . 0.35)
1778                     (height-limit . 1.0)
1779                     (horizontal-distance-penalty-factor . 10)
1780                     (min-length-penalty-factor . 20)
1781                     (tie-tie-collision-distance . 0.45) 
1782                     (tie-tie-collision-penalty . 25.0)
1783                     (intra-space-threshold . 1.25)
1784                     (outer-tie-vertical-distance-symmetry-penalty-factor . 10)
1785                     (outer-tie-length-symmetry-penalty-factor . 10)
1786                     (outer-tie-vertical-gap . 0.25)
1787                     (multi-tie-region-size . 1)
1788                     (between-length-limit . 1.0)))
1789         
1790         (thickness . 1.2)
1791         (line-thickness . 0.8)
1792         (meta . ((class . Spanner)
1793                  (interfaces . (tie-interface))))
1794         ))
1795
1796     (TieColumn
1797      . (
1798         (positioning-done . ,ly:tie-column::calc-positioning-done)
1799         (before-line-breaking . ,ly:tie-column::before-line-breaking)
1800         (X-extent . #f)
1801         (Y-extent . #f)
1802         (meta . ((class . Spanner)
1803                  (interfaces . (tie-column-interface))))))
1804
1805     (TimeSignature
1806      . (
1807         (stencil . ,ly:time-signature::print)
1808         (break-align-symbol . time-signature)
1809         (break-visibility . ,all-visible)
1810         (space-alist . (
1811                         (first-note . (fixed-space . 2.0))
1812                         (right-edge . (extra-space . 0.5))
1813                         (staff-bar . (minimum-space . 2.0))))
1814         (non-musical . #t)
1815         (style . C)
1816         (meta . ((class . Item)
1817                  (interfaces . (time-signature-interface
1818                                 break-aligned-interface
1819                                 font-interface))))))
1820
1821     (TrillSpanner
1822      . (
1823         (stencil . ,ly:dynamic-text-spanner::print)
1824         (edge-text . ,(cons (make-musicglyph-markup "scripts.trill")
1825                             ""))
1826         (style . trill)
1827         (staff-padding . 1.0)
1828         (padding . 0.5)
1829         (direction . ,UP)
1830         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1831         (side-axis . ,Y)
1832         (meta . ((class . Spanner)
1833                  (interfaces . (text-spanner-interface
1834                                 line-spanner-interface
1835                                 side-position-interface
1836                                 font-interface))))))
1837
1838     (TrillPitchAccidental
1839      . ((X-offset . ,ly:side-position-interface::x-aligned-side)
1840         (padding . 0.2)
1841         (direction . ,LEFT)
1842         (font-size . -4)
1843         (side-axis . ,X)
1844         (stencil . ,ly:accidental-interface::print)
1845         (meta . ((class . Item)
1846                  (interfaces . (item-interface
1847                                 trill-pitch-accidental-interface
1848                                 side-position-interface
1849                                 font-interface))))))
1850
1851     (TrillPitchGroup
1852      . ((X-offset . ,ly:side-position-interface::x-aligned-side)
1853         (axes . (,X))
1854         (font-size . -4)
1855         (stencil . ,parenthesize-elements)
1856         (direction . ,RIGHT)
1857         (side-axis . ,X)
1858         (padding . 0.3)
1859         (meta . ((class . Item)
1860                  (interfaces . (side-position-interface
1861                                 note-head-interface
1862                                 rhythmic-head-interface
1863                                 font-interface
1864                                 accidental-interface
1865                                 axis-group-interface))))))
1866
1867     (TrillPitchHead
1868      . (
1869         (stencil . ,ly:note-head::print)
1870         (duration-log . 2)
1871         (Y-offset . ,ly:staff-symbol-referencer::callback)
1872         (font-size . -4)
1873         (meta . ((class . Item)
1874                  (interfaces . (item-interface
1875                                 rhythmic-head-interface
1876                                 font-interface
1877                                 pitched-trill-interface
1878                                 ledgered-interface
1879                                 staff-symbol-referencer-interface))))))
1880
1881     (TupletBracket
1882      . (
1883         (padding . 1.1)
1884         (thickness . 1.6)
1885         (edge-height . (0.7 . 0.7))
1886         (shorten-pair . (-0.2 . -0.2))
1887         (staff-padding . 0.25)
1888         (direction  . ,ly:tuplet-bracket::calc-direction)
1889         (positions . ,ly:tuplet-bracket::calc-positions)
1890         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
1891         (control-points . ,ly:tuplet-bracket::calc-control-points)
1892         (stencil . ,ly:tuplet-bracket::print)
1893         
1894         (meta . ((class . Spanner)
1895                  (interfaces . (line-interface
1896                                 tuplet-bracket-interface))))))
1897
1898     (TupletNumber
1899      . (
1900         (stencil . ,ly:tuplet-number::print)
1901         (text . ,tuplet-number::calc-denominator-text)
1902         (font-shape . italic)
1903         (font-size . -2)
1904         (avoid-slur . inside)
1905         (meta . ((class . Spanner)
1906                  (interfaces . (text-interface tuplet-number-interface
1907                                 font-interface))))))
1908     
1909     (UnaCordaPedal
1910      . (
1911         (stencil . ,ly:text-interface::print)
1912         (font-shape . italic)
1913         (no-spacing-rods . #t)
1914         (self-alignment-X . 0)
1915         (direction . ,RIGHT)
1916         (padding . 0.0)  ;; padding relative to UnaCordaPedalLineSpanner
1917         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1918         (meta . ((class . Item)
1919                  (interfaces . (text-interface
1920                                 piano-pedal-script-interface
1921                                 self-alignment-interface
1922                                 font-interface))))))
1923
1924     (UnaCordaPedalLineSpanner
1925      . (
1926         (axes . (1))
1927         (Y-extent . ,ly:axis-group-interface::height)
1928         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1929         (side-axis . ,Y)
1930         (padding . 1.2)
1931         (staff-padding . 1.2)
1932         (minimum-space . 1.0)
1933         (direction . ,DOWN)
1934         (meta . ((class . Spanner)
1935                  (interfaces . (piano-pedal-interface
1936                                 axis-group-interface
1937                                 side-position-interface))))))
1938
1939     (VaticanaLigature
1940      . (
1941         (thickness . 0.6)
1942         (flexa-width . 2.0)
1943         (stencil . ,ly:vaticana-ligature::print)
1944         (meta . ((class . Spanner)
1945                  (interfaces . (vaticana-ligature-interface
1946                                 font-interface))))))
1947
1948     (VerticalAlignment
1949      . (
1950         (axes . (1))
1951         (positioning-done . ,ly:align-interface::calc-positioning-done)
1952         (after-line-breaking . ,ly:align-interface::stretch-after-break)
1953         (Y-extent . ,ly:axis-group-interface::height)
1954         (X-extent . ,ly:axis-group-interface::width)
1955         (stacking-dir . -1)
1956         (padding . 0.1) 
1957         (meta . ((class . Spanner)
1958                  (interfaces . (align-interface
1959                                 axis-group-interface))))))
1960     (VerticalAxisGroup
1961      . (
1962         (axes . (1))
1963         (Y-offset . ,ly:hara-kiri-group-spanner::force-hara-kiri-callback)
1964         (Y-extent . ,ly:hara-kiri-group-spanner::y-extent)
1965         (X-extent . ,ly:axis-group-interface::width)
1966         (meta . ((class . Spanner)
1967                  (interfaces . (axis-group-interface
1968                                 hara-kiri-group-interface
1969                                 vertically-spaceable-interface))))))
1970
1971
1972     (VoltaBracket
1973      . (
1974         (stencil . ,ly:volta-bracket-interface::print)
1975         (direction . ,UP)
1976         (padding . 1)
1977         (font-encoding . fetaNumber)
1978         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1979         (side-axis . ,Y)
1980         (thickness . 1.6)  ;;  line-thickness
1981         (edge-height . (2.0 . 2.0)) ;; staff-space;
1982         (minimum-space . 5)
1983         (font-size . -4)
1984         (meta . ((class . Spanner)
1985                  (interfaces . (volta-bracket-interface
1986                                 horizontal-bracket-interface                            
1987                                 line-interface
1988                                 text-interface
1989                                 side-position-interface
1990                                 font-interface)))
1991               )))
1992
1993
1994     (VoiceFollower
1995      . (
1996         (style . line)
1997         (gap . 0.5)
1998         (non-musical . #t)
1999         (X-extent . #f)
2000         (Y-extent . #f)
2001         (stencil . ,ly:line-spanner::print)
2002         (after-line-breaking . ,ly:line-spanner::after-line-breaking)
2003         (meta . ((class . Spanner)
2004                  (interfaces . (line-spanner-interface
2005                                 line-interface))))
2006         ))
2007
2008 ))
2009
2010 (define (completize-grob-entry x)
2011   "Transplant assoc key into 'name entry of 'meta of X.  Set interfaces for Item, Spanner etc.
2012 "
2013   ;;  (display (car x))
2014   ;;  (newline)
2015   (let* ((name-sym  (car x))
2016          (grob-entry (cdr x))
2017          (meta-entry (cdr (assoc 'meta grob-entry)))
2018          (class (cdr (assoc 'class meta-entry)))
2019          (ifaces-entry
2020           (cdr (assoc 'interfaces meta-entry))))
2021
2022     (cond
2023      ((eq? 'Item class)
2024       (set! ifaces-entry (cons 'item-interface ifaces-entry)))
2025      ((eq? 'Spanner class)
2026       (set! ifaces-entry (cons 'spanner-interface ifaces-entry)))
2027      ((eq? 'Paper_column class)
2028       (set! ifaces-entry (cons 'item-interface
2029                                (cons 'paper-column-interface ifaces-entry))))
2030      ((eq? 'System class)
2031       (set! ifaces-entry (cons 'system-interface
2032                                (cons 'spanner-interface ifaces-entry))))
2033      (else
2034       (ly:warning "Unknown class ~a" class)))
2035     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
2036
2037     (set! meta-entry (assoc-set! meta-entry 'name name-sym))
2038     (set! meta-entry (assoc-set! meta-entry 'interfaces
2039                                  ifaces-entry))
2040     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
2041     (cons name-sym grob-entry)))
2042
2043 (set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
2044
2045 ;;  (display (map pair? all-grob-descriptions))
2046
2047 ;; make sure that \property Foo.Bar =\turnOff doesn't complain
2048
2049 (map (lambda (x)
2050        ;; (display (car x)) (newline)
2051
2052        (set-object-property! (car x) 'translation-type? list?)
2053        (set-object-property! (car x) 'is-grob? #t))
2054      all-grob-descriptions)
2055
2056 (set! all-grob-descriptions (sort all-grob-descriptions alist<?))
2057
2058 (define pure-print-callbacks
2059   (list
2060    ly:note-head::print
2061    ly:clef::print
2062    ly:text-interface::print
2063    ly:script-interface::print))
2064
2065 ;; ly:grob::stencil-extent is safe iff the print callback is safe too
2066 (define (pure-stencil-height grob start stop)
2067   (let ((sten (ly:grob-property-data grob 'stencil)))
2068     (if (or
2069          (ly:stencil? sten)
2070          (memq sten pure-print-callbacks))
2071         (ly:grob::stencil-height grob)
2072         '(0 . 0))))
2073
2074 (define pure-conversions-alist
2075   (list
2076    `(,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
2077    `(,ly:stem::height . ,ly:stem::pure-height)
2078    `(,ly:grob::stencil-height . ,pure-stencil-height)
2079    `(,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
2080    `(,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
2081    `(,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
2082    `(,ly:slur::height . ,ly:slur::pure-height)
2083    `(,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)))
2084
2085 (define pure-functions
2086   (list
2087    ly:staff-symbol-referencer::callback
2088    ly:staff-symbol::height))
2089
2090 (define-public (pure-relevant grob)
2091   (let ((extent-callback (ly:grob-property-data grob 'Y-extent)))
2092     (not (eq? #f
2093               (or
2094                (pair? extent-callback)
2095                (memq extent-callback pure-functions)
2096                (and
2097                 (pair? (assq extent-callback pure-conversions-alist))
2098                 (begin
2099                   (or
2100                    (not (eq? extent-callback ly:grob::stencil-height))
2101                    (memq (ly:grob-property-data grob 'stencil) pure-print-callbacks)
2102                    (ly:stencil? (ly:grob-property-data grob 'stencil))))))))))
2103
2104 (define-public (call-pure-function unpure args start end)
2105   (if (ly:simple-closure? unpure)
2106       (ly:eval-simple-closure (car args) unpure start end)
2107       (if (not (procedure? unpure))
2108           unpure
2109           (if (memq unpure pure-functions)
2110               (apply unpure args)
2111               (let ((pure (assq unpure pure-conversions-alist)))
2112                 (if pure
2113                     (apply (cdr pure) (append (list (car args) start end) (cdr args)))))))))