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