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