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