]> git.donarmstrong.com Git - lilypond.git/blob - scm/define-grobs.scm
Calculate vertical extent of arpeggio via positions property.
[lilypond.git] / scm / define-grobs.scm
1 ;;;; define-grobs.scm --
2 ;;;;
3 ;;;;  source file of the GNU LilyPond music typesetter
4 ;;;;
5 ;;;; (c) 1998--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 ;;;;                 Jan Nieuwenhuizen <janneke@gnu.org>
7
8 ;;;; distances are given in line-thickness (thicknesses) and
9 ;;;; staff-space (distances)
10
11 ;;;; WARNING: the meta field should be the last one.
12 ;;;; WARNING: don't use anonymous functions for initialization.
13
14 ;; TODO: junk the meta field in favor of something more compact?
15
16 ;;; todo:: reorder sensibly.
17
18 (define-public all-grob-descriptions
19   `(
20     (Accidental
21      . (
22         (avoid-slur . inside)
23         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
24         (alteration . ,accidental-interface::calc-alteration) 
25         (stencil . ,ly:accidental-interface::print)
26         (Y-extent . ,ly:accidental-interface::height)
27         (X-extent . ,ly:accidental-interface::width)
28         (meta . ((class . Item)
29                  (interfaces . (accidental-interface
30                                 font-interface))))))
31     (AccidentalCautionary
32      . (
33         (avoid-slur . inside)
34         (parenthesized . #t)
35         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
36         (alteration . ,accidental-interface::calc-alteration) 
37         (stencil . ,ly:accidental-interface::print)
38         (Y-extent . ,ly:accidental-interface::height)
39         (meta . ((class . Item)
40                  (interfaces . (accidental-interface
41                                 font-interface))))))
42
43     
44     (AccidentalSuggestion
45      . (
46         (stencil . ,ly:accidental-interface::print)
47         (Y-extent . ,ly:accidental-interface::height)
48         (X-offset . ,(ly:make-simple-closure
49                       `(,+
50                         ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent))
51                         ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
52         (self-alignment-X . ,CENTER)
53         (font-size . -2)
54         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
55         (alteration . ,accidental-interface::calc-alteration)
56         (Y-offset . ,ly:side-position-interface::y-aligned-side)
57         (direction . ,UP)
58         (staff-padding . 0.25)
59         (outside-staff-priority . 0)
60         (script-priority . 0)
61         (side-axis . ,X)
62         (meta . ((class . Item)
63                  (interfaces . (side-position-interface
64                                 script-interface
65                                 accidental-interface
66                                 accidental-suggestion-interface
67                                 self-alignment-interface
68                                 font-interface))))))
69
70     (AccidentalPlacement
71      . (
72         (left-padding . 0.2)
73
74         ;; for horizontally stacked scripts.
75         (script-priority .  -100)
76         (direction .  ,LEFT)
77         
78         (positioning-done . ,ly:accidental-placement::calc-positioning-done)
79         (X-extent . ,ly:axis-group-interface::width)                  
80         
81         ;; this is quite small, but it is very ugly to have
82         ;; accs closer to the previous note than to the next one.
83         (right-padding . 0.15)
84         (meta . ((class . Item)
85                  (interfaces . (accidental-placement-interface))))))
86     
87     (Ambitus
88      . (
89         (axes . (0 1))
90         (X-extent . ,ly:axis-group-interface::width)
91         (Y-extent . ,ly:axis-group-interface::height)
92         (space-alist . (
93                         (clef . (extra-space . 0.5))
94                         (key-signature . (extra-space . 0.0))
95                         (staff-bar . (extra-space . 0.0))
96                         (time-signature . (extra-space . 0.0))
97                         (first-note . (fixed-space . 0.0))))
98         (non-musical . #t)
99         (break-align-symbol . ambitus)
100         (break-visibility . ,begin-of-line-visible)
101         (meta . ((class . Item)
102                  (interfaces . (axis-group-interface
103                                 break-aligned-interface
104                                 ambitus-interface))))))
105
106     (AmbitusLine
107      . (
108         (stencil . ,ly:ambitus::print)
109         (join-heads . #t)
110         (thickness . 2)
111         (X-offset . ,ly:self-alignment-interface::centered-on-x-parent)
112         (meta . ((class . Item)
113                  (interfaces . (ambitus-interface
114                                 staff-symbol-referencer-interface
115                                 font-interface))))))
116     (AmbitusAccidental
117      . (
118         (font-family . music)
119         (padding . 0.5)
120         (X-offset . ,ly:side-position-interface::x-aligned-side)
121         (direction . ,LEFT)
122         (stencil . ,ly:accidental-interface::print)
123         (Y-extent . ,ly:accidental-interface::height)
124         (glyph-name-alist . ,standard-alteration-glyph-name-alist)      
125         (side-axis . ,X)
126         (meta . ((class . Item)
127                  (interfaces . (
128                                 accidental-interface
129                                 break-aligned-interface
130                                 side-position-interface
131                                 font-interface))))))
132
133     (AmbitusNoteHead
134      . (
135         (duration-log . 2)
136         (stencil . ,ly:note-head::print)
137         (glyph-name . ,note-head::calc-glyph-name)
138         (Y-offset . ,ly:staff-symbol-referencer::callback)
139         (meta . ((class . Item)
140                  (interfaces . (font-interface
141                                 note-head-interface
142                                 ambitus-interface
143                                 staff-symbol-referencer-interface
144                                 rhythmic-head-interface
145                                 ledgered-interface))))))
146
147     (Arpeggio
148      . ((X-extent . ,ly:arpeggio::width)
149         (stencil . ,ly:arpeggio::print)
150         (Y-offset . ,ly:staff-symbol-referencer::callback)
151         (X-offset . ,ly:side-position-interface::x-aligned-side)
152         (direction . ,LEFT)
153         (positions . ,ly:arpeggio::calc-positions)
154         (padding . 0.5)
155         (script-priority . 0)
156         (side-axis . ,X)
157         (staff-position . 0.0)
158         (Y-extent . ,ly:arpeggio::height)
159         (meta . ((class . Item)
160                  (interfaces . (arpeggio-interface
161                                 staff-symbol-referencer-interface
162                                 side-position-interface
163                                 font-interface))))))
164
165     (BalloonTextItem 
166      . ((stencil . ,ly:balloon-interface::print)
167         (text . ,(grob::calc-property-by-copy 'text)) 
168         (X-offset . ,(grob::calc-property-by-copy 'X-offset)) 
169         (Y-offset . ,(grob::calc-property-by-copy 'Y-offset)) 
170         (meta . ((class . Item)
171                  (interfaces . (text-interface
172                                 font-interface))))))
173     (BarLine
174      . (
175         (break-align-symbol . staff-bar)
176         (break-align-anchor . ,ly:bar-line::calc-anchor)
177         (glyph . "|")
178         (gap . 0.4)
179         (layer . 0)
180         (break-visibility . ,bar-line::calc-break-visibility)
181         (non-musical . #t)
182         (stencil . ,ly:bar-line::print)
183         (glyph-name . ,bar-line::calc-glyph-name)
184         (bar-size .  ,ly:bar-line::calc-bar-size)
185         
186         (space-alist . (
187                         (time-signature . (extra-space . 0.75))
188                         (custos . (minimum-space . 2.0))
189                         (clef . (minimum-space . 1.0))
190                         (key-signature . (extra-space . 1.0))
191                         (key-cancellation . (extra-space . 1.0))
192                         (first-note . (fixed-space . 1.3))
193                         (next-note . (semi-fixed-space . 0.9))
194                         (right-edge . (extra-space . 0.0))))
195
196         ;;
197         ;; Ross. page 151 lists other values, we opt for a leaner look
198         ;;
199         ;; TODO:
200         ;; kern should scale with line-thickness too.
201         (kern . 3.0)
202         (thin-kern . 3.0)
203         (hair-thickness . 1.9)
204         (thick-thickness . 6.0)
205         (meta . ((class . Item)
206                  (interfaces . (bar-line-interface
207                                 break-aligned-interface
208                                 font-interface))))))
209
210     (BarNumber
211      . (
212         (stencil . ,ly:text-interface::print)
213         (non-musical . #t)
214         (break-visibility . ,begin-of-line-visible)
215         (padding . 1.0)
216         (direction . ,UP)
217         (font-family . roman)
218         (font-size . -2)
219         (Y-offset . ,ly:side-position-interface::y-aligned-side)
220         (side-axis . ,Y)
221         (outside-staff-priority . 100)
222         (X-offset . ,(ly:make-simple-closure
223                       `(,+
224                         ,(ly:make-simple-closure
225                           (list ly:break-alignable-interface::self-align-callback))
226                         ,(ly:make-simple-closure
227                           (list ly:self-alignment-interface::x-aligned-on-self)))))
228
229         (self-alignment-X . 1)
230
231         ;; want the bar number before the clef at line start. 
232         (break-align-symbols . (left-edge staff-bar))
233         (meta .
234               ((class . Item)
235                (interfaces . (side-position-interface
236                               text-interface
237                               break-alignable-interface
238                               self-alignment-interface
239                               font-interface
240                               ))))
241         ))
242
243     (BassFigure
244      . (
245         (stencil . ,ly:text-interface::print)
246         (meta . ((class . Item)
247                  (interfaces . (text-interface
248                                 rhythmic-grob-interface
249                                 bass-figure-interface
250                                 font-interface))))))
251
252     (BassFigureAlignment
253      . (
254         (axes . (,Y))
255         (threshold . (2 . 1000))
256         (positioning-done . ,ly:align-interface::calc-positioning-done)
257         (Y-extent . ,ly:axis-group-interface::height)
258         (stacking-dir . -1)
259         (padding . 0.2)
260         (meta . ((class . Spanner)
261                  (interfaces . (align-interface
262                                 bass-figure-alignment-interface
263                                 axis-group-interface))))))
264
265     (BassFigureAlignmentPositioning
266      . ((Y-offset . ,ly:side-position-interface::y-aligned-side)
267         (side-axis . ,Y)
268         (direction . ,UP)
269         (Y-extent . ,ly:axis-group-interface::height)
270         (axes . (,Y))
271         (staff-padding . 1.0)
272         (padding . 0.5)
273         (meta . ((class . Spanner)
274                  (interfaces . (side-position-interface
275                                 axis-group-interface
276                              ))))))
277     
278     (BassFigureBracket
279      . (
280         (stencil . ,ly:enclosing-bracket::print)
281         (X-extent . ,ly:enclosing-bracket::width)
282         (edge-height . (0.2 . 0.2))
283         (meta . ((class . Item)
284                  (interfaces . (enclosing-bracket-interface)) ))
285         ))
286     (BassFigureContinuation
287      . (
288         (stencil . ,ly:figured-bass-continuation::print)
289         (Y-offset . ,ly:figured-bass-continuation::center-on-figures)
290         (meta . ((class . Spanner)
291                  (interfaces . (figured-bass-continuation-interface))
292                  ))))
293     (BassFigureLine
294      . (
295         (axes . (,Y))
296         (Y-extent . ,ly:axis-group-interface::height)
297         (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
298         (adjacent-pure-heights . ,ly:axis-group-interface::adjacent-pure-heights)
299         (meta . ((class . Spanner)
300                  (interfaces . (axis-group-interface
301                                 ))))))
302
303
304     (Beam
305      . (
306         ;; todo: clean this up a bit: the list is getting
307         ;; rather long.
308         (gap . 0.8)
309         (positions .  ,(ly:make-simple-closure
310                         (ly:make-simple-closure
311                          (list chain-grob-member-functions
312                            `(,cons 0 0)
313                            ly:beam::calc-least-squares-positions
314                            ly:beam::slope-damping
315                            ly:beam::shift-region-to-valid
316                            ly:beam::quanting
317                            ))))
318
319         ;; this is a hack to set stem lengths, if positions is set.
320         (quantized-positions . ,ly:beam::set-stem-lengths)
321         (concaveness . ,ly:beam::calc-concaveness)
322         (direction . ,ly:beam::calc-direction)
323         (shorten . ,ly:beam::calc-stem-shorten)
324         (beaming . ,ly:beam::calc-beaming)
325         (stencil . ,ly:beam::print)
326         (clip-edges . #t)
327         (cross-staff . ,ly:beam::calc-cross-staff)
328
329         (details .  ((hint-direction-penalty . 20)))
330         ;; TODO: should be in SLT.
331         (thickness . 0.48) ; in staff-space
332         (neutral-direction . ,DOWN)
333
334         ;; Whe have some unreferenced problems here.
335         ;;
336         ;; If we shorten beamed stems less than normal stems (1 staff-space),
337         ;; or high order less than 8th beams, patterns like
338         ;;     c''4 [c''8 c''] c''4 [c''16 c]
339         ;; are ugly (different stem lengths).
340         ;;
341         ;; But if we shorten 16th beams as much as 8th beams, a single
342         ;; forced 16th beam looks *very* short.
343
344         ;; We choose to shorten 8th beams the same as single stems,
345         ;; and high order beams less than 8th beams, so that all
346         ;; isolated shortened beams look nice and a bit shortened,
347         ;; sadly possibly breaking patterns with high order beams.
348         (beamed-stem-shorten . (1.0 0.5 0.25))
349         (damping . 1)
350         (auto-knee-gap . 5.5)
351
352         ;; only for debugging.
353         (font-family . roman)
354         (meta . ((class . Spanner)
355                  (object-callbacks . ((normal-stems . ,ly:beam::calc-normal-stems))) 
356                  (interfaces . (staff-symbol-referencer-interface
357                                 unbreakable-spanner-interface
358                                 beam-interface))))))
359
360     (BendAfter
361      . (
362         (stencil . ,bend::print)
363         (thickness . 2.0)
364         (meta . ((class . Spanner)
365                  (interfaces . (spanner-interface
366                                 bend-after-interface))))))
367
368     (BreakAlignment
369      . (
370         (non-musical . #t)
371         (stacking-dir . 1)
372         (positioning-done . ,ly:break-alignment-interface::calc-positioning-done)
373         (X-extent . ,ly:axis-group-interface::width)
374         (break-align-orders . ;; end of line
375                             #((
376                                left-edge
377                                ambitus
378                                breathing-sign
379                                clef
380                                staff-bar
381                                key-cancellation
382                                key-signature
383                                time-signature
384                                custos)
385
386                               ;; unbroken
387                               (
388                                left-edge
389                                ambitus
390                                breathing-sign
391                                clef
392                                staff-bar
393                                key-cancellation
394                                key-signature
395                                staff
396                                time-signature custos)
397
398                               ;; begin of line
399                               (
400                                left-edge
401                                ambitus
402                                breathing-sign
403                                clef
404                                key-cancellation
405                                key-signature
406                                staff-bar
407                                time-signature
408                                custos)))
409         (axes . (0))
410         (meta . ((class . Item)
411                  (interfaces . (break-alignment-interface
412                                 axis-group-interface))))))
413
414     (BreakAlignGroup
415      . (
416         (axes . (0))
417         (X-extent . ,ly:axis-group-interface::width)
418         (break-align-anchor . ,ly:break-aligned-interface::calc-average-anchor)
419         (break-visibility . ,ly:break-aligned-interface::calc-break-visibility)
420         (meta . ((class . Item)
421                  (interfaces . (break-aligned-interface
422                                 axis-group-interface))))))
423
424     (BreathingSign
425      . (
426         (break-align-symbol . breathing-sign)
427         (non-musical . #t)
428         (space-alist . (
429                         (ambitus . (extra-space . 2.0))
430                         (custos . (minimum-space . 1.0))
431                         (key-signature . (minimum-space . 1.5))
432                         (time-signature . (minimum-space . 1.5))
433                         (staff-bar . (minimum-space . 1.5))
434                         (clef . (minimum-space . 2.0))
435                         (first-note . (fixed-space . 1.0)) ;huh?
436                         (right-edge . (extra-space . 0.1))))
437         (stencil . ,ly:text-interface::print)
438         (text . ,(make-musicglyph-markup "scripts.rcomma"))
439         (Y-offset . ,ly:breathing-sign::offset-callback)
440         (break-visibility . ,begin-of-line-invisible)
441         (meta . ((class . Item)
442                  (interfaces . (break-aligned-interface
443                                 breathing-sign-interface
444                                 text-interface
445                                 font-interface))))))
446
447     (Clef
448      . (
449         (stencil . ,ly:clef::print)
450         (glyph-name . ,ly:clef::calc-glyph-name)
451         (non-musical . #t)
452         (avoid-slur . inside)
453         (font-family . music)
454         (break-align-symbol . clef)
455         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
456         (break-visibility . ,begin-of-line-visible)
457         (space-alist . ((ambitus . (extra-space . 2.0))
458                         (staff-bar . (extra-space . 0.7))
459                         (key-cancellation . (minimum-space . 3.5))
460                         (key-signature . (minimum-space . 3.5))
461                         (time-signature . (minimum-space . 4.2))
462                         (first-note . (minimum-fixed-space . 5.0))
463                         (next-note . (extra-space . 0.5))
464                         (right-edge . (extra-space . 0.5))))
465         (Y-offset . ,ly:staff-symbol-referencer::callback)
466         (meta . ((class . Item)
467                  (interfaces . (clef-interface
468                                 staff-symbol-referencer-interface
469                                 font-interface
470                                 break-aligned-interface))))))
471
472     (ClusterSpannerBeacon
473      . (
474         (Y-extent . ,ly:cluster-beacon::height)
475         (meta . ((class . Item)
476                  (interfaces . (rhythmic-grob-interface
477                                 cluster-beacon-interface))))))
478
479     (ClusterSpanner
480      . (
481         (springs-and-rods . ,ly:spanner::set-spacing-rods)
482         (stencil . ,ly:cluster::print)
483         (minimum-length . 0.0)
484         (padding . 0.25)
485         (style . ramp)
486         (meta . ((class . Spanner)
487                  (interfaces . (cluster-interface))))))
488
489     (ChordName
490      . (
491         (stencil . ,ly:text-interface::print)
492         (after-line-breaking . ,ly:chord-name::after-line-breaking)
493         (word-space . 0.0)
494         (font-family . sans)
495         (font-size . 1.5)
496         (meta . ((class . Item)
497                  (interfaces . (font-interface
498                                 rhythmic-grob-interface
499                                 text-interface
500                                 chord-name-interface
501                                 ))))))
502
503     (CombineTextScript
504      . (
505         (stencil . ,ly:text-interface::print)
506         (extra-spacing-width . (+inf.0 . -inf.0))
507         (Y-offset . ,ly:side-position-interface::y-aligned-side)
508         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
509         (direction . ,UP)
510         (padding . 0.5)
511         (staff-padding . 0.5)
512         (script-priority . 200)
513         ;; todo: add X self alignment?
514         (baseline-skip . 2)
515         (side-axis . ,Y)
516         (font-series . bold)
517         (meta . ((class . Item)
518                  (interfaces . (text-script-interface
519                                 text-interface
520                                 side-position-interface
521                                 font-interface))))))
522
523     (Custos
524      . (
525         (break-align-symbol . custos)
526         (non-musical . #t)
527         (stencil . ,ly:custos::print)
528         (break-visibility . ,end-of-line-visible)
529         (style . vaticana)
530         (neutral-direction . ,DOWN)
531         (Y-offset . ,ly:staff-symbol-referencer::callback)
532         (space-alist . (
533                         (first-note . (minimum-fixed-space . 0.0))
534                         (right-edge . (extra-space . 0.1))))
535         (meta . ((class . Item)
536                  (interfaces
537                   . (custos-interface
538                      staff-symbol-referencer-interface
539                      font-interface
540                      break-aligned-interface))))))
541
542     (DotColumn
543      . (
544         (axes . (0))
545         (direction . ,RIGHT)
546         (positioning-done . ,ly:dot-column::calc-positioning-done) 
547         (X-extent . ,ly:axis-group-interface::width)
548         (meta . ((class . Item)
549                  (interfaces . (dot-column-interface
550                                 axis-group-interface))))))
551
552     (Dots
553      . (
554         (stencil . ,ly:dots::print)
555         (dot-count . ,dots::calc-dot-count)
556         (staff-position . ,dots::calc-staff-position)
557         (meta . ((class . Item)
558                  (interfaces . (font-interface
559                                 staff-symbol-referencer-interface
560                                 dots-interface))))))
561
562     (DoublePercentRepeat
563      . (
564         (stencil . ,ly:percent-repeat-item-interface::double-percent)
565         (non-musical . #t)
566         (slope . 1.0)
567         (font-encoding . fetaMusic)
568         (width . 2.0)
569         (thickness . 0.48)
570         (break-align-symbol . staff-bar)
571         (break-visibility . ,begin-of-line-invisible)
572         (meta . ((class . Item)
573                  (interfaces . (font-interface
574                                 break-aligned-interface
575                                 percent-repeat-item-interface))))))
576
577     (DoublePercentRepeatCounter
578      . (
579         (stencil . ,ly:text-interface::print)
580         (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-y-parent))
581                                                   ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
582         (Y-offset . ,ly:side-position-interface::y-aligned-side)
583         (font-encoding . fetaNumber)
584         (self-alignment-X . 0)
585         (font-size . -2) 
586         (direction . ,UP)
587         (padding . 0.2)
588         (staff-padding . 0.25)
589         (side-axis . ,Y)
590         (meta . ((class . Item)
591                  (interfaces . (side-position-interface
592                                 self-alignment-interface
593                                 percent-repeat-item-interface
594                                 font-interface
595                                 text-interface))))))
596     (DynamicLineSpanner
597      . (
598         (axes . (1))
599         (Y-offset . ,ly:side-position-interface::y-aligned-side)
600         (staff-padding . 0.1)
601         (padding . 0.6)
602         (slur-padding . 0.3)
603         (minimum-space . 1.2)
604         (direction . ,DOWN)
605         (side-axis . ,Y)
606         (outside-staff-priority . 250)
607         (Y-extent . ,ly:axis-group-interface::height)
608         (X-extent . ,ly:axis-group-interface::width)
609         (cross-staff . ,ly:side-position-interface::calc-cross-staff)
610         (meta . ((class . Spanner)
611                  (interfaces . (axis-group-interface
612                                 dynamic-interface
613                                 dynamic-line-spanner-interface
614                                 side-position-interface))))))
615
616     (DynamicText
617      . (
618
619         ;; todo.
620
621         (stencil . ,ly:text-interface::print)
622         (direction . ,ly:script-interface::calc-direction)
623         (positioning-done . ,ly:script-interface::calc-positioning-done)
624
625         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
626         (self-alignment-X . 0)
627         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
628         (self-alignment-Y . 0)
629         (font-series . bold)
630         (font-encoding . fetaDynamic)
631         (font-shape . italic)
632         (extra-spacing-width . (+inf.0 . -inf.0))
633         (outside-staff-priority . 250)
634         (meta . ((class . Item)
635                  (interfaces . (font-interface
636                                 text-interface
637                                 self-alignment-interface
638                                 dynamic-interface
639                                 script-interface))))))
640
641     (DynamicTextSpanner
642      . (
643         ;; rather ugh with NCSB
644         ;; (font-series . bold)
645         (font-shape . italic)
646         (style . dashed-line)
647
648         ;; make sure the spanner doesn't get too close to notes
649         (minimum-Y-extent . (-1 . 1))
650         (bound-details . ((right . ((attach-dir .  ,LEFT)
651                                     (Y . 0)
652                                     (padding . 0.75)
653                                     ))
654                           (right-broken . ((attach-dir .  ,RIGHT)
655                                     (padding . 0.0)
656                                     ))
657                           
658                           (left . ((attach-dir .  ,LEFT)
659                                    (Y . 0)
660                                    (stencil-offset . (0 . -0.5))
661                                    (padding . 0.5)
662                                    ))
663                           (left-broken . ((attach-dir .  ,RIGHT)
664                                    ))
665                           ))
666         (stencil . ,ly:line-spanner::print)
667         (left-bound-info . ,ly:line-spanner::calc-left-bound-info-and-text)
668         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
669
670         ;; need to blend with dynamic texts.
671         (font-size . 1)
672         (dash-fraction . 0.2)
673         (dash-period . 3.0)
674         (meta . ((class . Spanner)
675                  (interfaces . (font-interface
676                                 text-interface
677                                 line-spanner-interface
678                                 line-interface
679                                 dynamic-interface
680                                 dynamic-text-spanner-interface
681                                 spanner-interface))))))
682
683                                 
684     (Fingering
685      . (
686
687         ;; sync with TextScript (?)
688
689         (padding . 0.5)
690         (avoid-slur . around)
691         (slur-padding . 0.2)
692         (staff-padding . 0.5)
693         (self-alignment-X . 0)
694         (self-alignment-Y . 0)
695         (script-priority . 100)
696         (stencil . ,ly:text-interface::print)
697         (direction . ,ly:script-interface::calc-direction)
698         (positioning-done . ,ly:script-interface::calc-positioning-done)
699
700         (text . ,fingering::calc-text) 
701         (font-encoding . fetaNumber)
702         (font-size . -5)                ; don't overlap when next to heads.
703         (meta . ((class . Item)
704                  (interfaces . (finger-interface
705                                 font-interface
706                                 text-script-interface
707                                 text-interface
708                                 side-position-interface
709                                 self-alignment-interface
710                                 ))))))
711     (FretBoard
712      . ((stencil . ,fret-board::calc-stencil)
713         (finger-code . below-string)
714         (meta . ((class . Item)
715                  (interfaces . (fret-diagram-interface
716                                 font-interface
717                                 ))))
718               ))
719     (Glissando
720      . (
721         (style . line)
722         (gap . 0.5)
723         (zigzag-width . 0.75)
724         (X-extent . #f)
725         (Y-extent . #f)
726         (bound-details . ((right . ((attach-dir .  ,CENTER)
727                                     (padding . 1.5)
728                                       ))
729                           (left . ((attach-dir .  ,CENTER)
730                                    (padding . 1.5)
731                                       ))
732                           ))
733         (stencil . ,ly:line-spanner::print)
734         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
735         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
736         (meta . ((class . Spanner)
737                  (interfaces . (line-interface
738                                 unbreakable-spanner-interface
739                                 line-spanner-interface))))))
740
741     (GraceSpacing
742      . (
743         (common-shortest-duration . ,grace-spacing::calc-shortest-duration)
744         (spacing-increment . 0.8)
745         (shortest-duration-space . 1.6)
746         (meta . ((class . Spanner)
747                  (interfaces . (grace-spacing-interface
748                                 
749                                 spacing-options-interface
750                                 spanner-interface))))))
751     (GridPoint
752      . (
753         (X-extent . (0 . 0))
754         (Y-extent . (0 . 0))
755         (meta . ((class . Item)
756                  (interfaces . (grid-point-interface))))))
757
758     (GridLine
759      . (
760         (X-extent  . ,ly:grid-line-interface::width)
761         (stencil . ,ly:grid-line-interface::print)
762         (self-alignment-X . ,CENTER)
763         (X-offset . ,(ly:make-simple-closure
764                       `(,+  ,(ly:make-simple-closure
765                               (list ly:self-alignment-interface::centered-on-x-parent))
766                             ,(ly:make-simple-closure
767                               (list ly:self-alignment-interface::x-aligned-on-self)))))
768         (layer . 0)
769         (meta . ((class . Item)
770                  (interfaces . (self-alignment-interface
771                                 grid-line-interface))))))
772
773     (Hairpin
774      . (
775         (stencil . ,ly:hairpin::print)
776         (springs-and-rods . ,ly:spanner::set-spacing-rods)
777         (after-line-breaking . ,ly:hairpin::after-line-breaking)
778         (grow-direction . ,hairpin::calc-grow-direction)
779         (circled-tip . #f)
780         (thickness . 1.0)
781         (height . 0.6666)
782         (minimum-length . 2.0)
783         (bound-padding . 1.0)
784         (self-alignment-Y . 0)
785         (Y-offset . ,ly:self-alignment-interface::y-aligned-on-self)
786         (meta . ((class . Spanner)
787                  (interfaces . (hairpin-interface
788                                 line-interface
789                                 self-alignment-interface
790                                 dynamic-interface
791                                 spanner-interface))))))
792
793     (HorizontalBracket
794      . (
795         (thickness . 1.0)
796         (stencil . ,ly:horizontal-bracket::print)
797         (Y-offset . ,ly:side-position-interface::y-aligned-side)
798         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
799         
800         (padding . 0.2)
801         (staff-padding . 0.2)
802         (direction . ,DOWN)
803         (side-axis . ,Y)
804         (bracket-flare . (0.5 . 0.5))
805         (meta . ((class . Spanner)
806                  (interfaces . (horizontal-bracket-interface
807                                 side-position-interface
808                                 line-interface
809                                 spanner-interface))))))
810     (InstrumentName
811      . (
812         (padding . 0.3)
813         (stencil . ,ly:system-start-text::print)
814         (X-offset . ,ly:side-position-interface::x-aligned-side)
815         (direction . ,LEFT)
816         (self-alignment-Y . ,CENTER)
817         (meta . ((class . Spanner)
818                  (interfaces . (system-start-text-interface
819                                 side-position-interface
820                                 font-interface))))))
821
822     (InstrumentSwitch
823      . (
824         (padding . 0.3)
825         (stencil . ,ly:text-interface::print)
826         (Y-offset . ,ly:side-position-interface::y-aligned-side)
827         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
828         (staff-padding . 2)
829         (direction . ,UP)
830         (self-alignment-X . ,CENTER)
831         (meta . ((class . Item)
832                  (interfaces . (side-position-interface
833                                 font-interface))))))
834     
835     (KeyCancellation
836      . (
837         (stencil . ,ly:key-signature-interface::print)
838         (glyph-name-alist . ,cancellation-glyph-name-alist)
839         (space-alist . (
840                         (time-signature . (extra-space . 1.25))
841                         (staff-bar . (extra-space . 0.6))
842                         (key-signature . (extra-space . 0.5))
843                         (right-edge . (extra-space . 0.5))
844                         (first-note . (fixed-space . 2.5))))
845         (Y-offset . ,ly:staff-symbol-referencer::callback)
846         (break-align-symbol . key-cancellation)
847         (break-visibility . ,begin-of-line-invisible)
848         (non-musical . #t)
849         (meta . ((class . Item)
850                  (interfaces . (key-cancellation-interface
851                                 key-signature-interface
852                                 font-interface
853                                 break-aligned-interface))))))
854     (KeySignature
855      . (
856         (stencil . ,ly:key-signature-interface::print)
857         (avoid-slur . inside)
858         (glyph-name-alist . ,standard-alteration-glyph-name-alist)
859         (space-alist . (
860                         (time-signature . (extra-space . 1.15))
861                         (staff-bar . (extra-space . 1.1))
862                         (right-edge . (extra-space . 0.5))
863                         (first-note . (fixed-space . 2.5))))
864         (Y-offset . ,ly:staff-symbol-referencer::callback)
865         (break-align-symbol . key-signature)
866         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
867         (break-visibility . ,begin-of-line-visible)
868         (non-musical . #t)
869         (meta . ((class . Item)
870                  (interfaces . (key-signature-interface
871                                 font-interface
872                                 break-aligned-interface))))))
873     
874     
875    (LaissezVibrerTie
876      . (
877         (stencil  . ,ly:tie::print)
878         (control-points . ,ly:semi-tie::calc-control-points)
879         (direction . ,ly:tie::calc-direction)
880         (details . ((ratio . 0.333)
881                     (height-limit . 1.0)))
882         (head-direction . ,LEFT)
883         (thickness . 1.0)
884         (meta . ((class . Item)
885                  (interfaces . (semi-tie-interface))
886                  ))
887         ))
888
889     (LaissezVibrerTieColumn
890      . (
891         (X-extent . #f)
892         (Y-extent . #f)
893         (head-direction . ,LEFT)
894         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
895         (meta . ((class . Item)
896                  (interfaces . (semi-tie-column-interface))
897                  ))
898         ))
899
900     (LedgerLineSpanner
901      . (
902         (springs-and-rods . ,ly:ledger-line-spanner::set-spacing-rods)
903         (stencil . ,ly:ledger-line-spanner::print)
904         (X-extent . #f)
905         (Y-extent . #f)
906         (minimum-length-fraction . 0.25)
907         (length-fraction . 0.25)
908         (layer . 0)
909         (meta . ((class . Spanner)
910                  (interfaces . (ledger-line-spanner-interface))))))
911
912     (LeftEdge
913      . (
914         (break-align-symbol . left-edge)
915         (break-align-anchor . ,ly:break-aligned-interface::calc-extent-aligned-anchor)
916         (X-extent . (0 . 0))
917         (non-musical . #t)
918         (break-visibility . ,center-invisible)
919         (space-alist . (
920                         (custos . (extra-space . 0.0))
921                         (ambitus . (extra-space . 2.0))
922                         (time-signature . (extra-space . 1.0))
923                         (staff-bar . (extra-space . 0.0))
924                         (breathing-sign . (minimum-space . 0.0))
925                         (clef . (extra-space . 0.8))
926                         (first-note . (fixed-space . 2.0))
927                         (right-edge . (extra-space . 0.0))
928                         (key-signature . (extra-space . 0.0))
929                         (key-cancellation . (extra-space . 0.0))
930                         ))
931         (meta . ((class . Item)
932                  (interfaces . (break-aligned-interface))))))
933
934     (LigatureBracket
935      . (
936         ;; ugh.  A ligature bracket is totally different from
937         ;; a tuplet bracket.
938
939         (padding . 2.0)
940         (thickness . 1.6)
941         (edge-height . (0.7 . 0.7))
942         (shorten-pair . (-0.2 . -0.2))
943         (direction . ,UP)
944         (positions . ,ly:tuplet-bracket::calc-positions)
945         (stencil . ,ly:tuplet-bracket::print)
946         (staff-padding . 0.25)
947         (connect-to-neighbor . ,ly:tuplet-bracket::calc-connect-to-neighbors)
948         (control-points . ,ly:tuplet-bracket::calc-control-points)
949         (meta . ((class . Spanner)
950                  (interfaces . (line-interface
951                                 tuplet-bracket-interface))))))
952
953
954     (LyricExtender
955      . (
956         (stencil . ,ly:lyric-extender::print)
957         (thickness . 0.8) ; line-thickness
958         (minimum-length . 1.5)
959         (Y-extent . (0 . 0))
960         (meta . ((class . Spanner)
961                  (interfaces . (lyric-interface
962                                 lyric-extender-interface))))))
963
964     (LyricHyphen
965      . (
966         (thickness . 1.3)
967         (height . 0.42)
968         (dash-period . 10.0)
969         (length . 0.66)
970         (minimum-length . 0.3)
971         (minimum-distance . 0.1)
972         (padding . 0.07)
973         (springs-and-rods . ,ly:lyric-hyphen::set-spacing-rods)
974         (stencil . ,ly:lyric-hyphen::print)
975         (Y-extent . (0 . 0))
976         (meta . ((class . Spanner)
977                  (interfaces . (lyric-interface
978                                 font-interface
979                                 lyric-hyphen-interface
980                                 spanner-interface))))))
981
982     (LyricSpace
983      . ((minimum-distance . 0.45)
984         (springs-and-rods . ,ly:lyric-hyphen::set-spacing-rods)
985         (padding . 0.0)
986         (Y-extent . #f)
987         (X-extent . #f)
988         (meta . ((class . Spanner)
989                  (interfaces . (spanner-interface
990                                 lyric-hyphen-interface ))
991                  ))
992         ))
993     
994     (LyricText
995      . (
996         (stencil . ,lyric-text::print)
997         (text . ,(grob::calc-property-by-copy 'text)) 
998         (X-offset . ,ly:self-alignment-interface::aligned-on-x-parent)
999         (self-alignment-X . 0)
1000         (word-space . 0.6)
1001         (font-series . bold-narrow)
1002         (font-size . 1.0)
1003         (extra-spacing-width . (0.0 . 0.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         (space-to-barline . #t)
1179         ;; Changed this from 0.75.
1180         ;; If you ever change this back, please document! --hwn
1181         (knee-spacing-correction . 1.0)
1182         (meta . ((class . Item)
1183                  (interfaces . (spacing-interface
1184                                 note-spacing-interface))))))
1185
1186     (NoteName
1187      . (
1188         (stencil . ,ly:text-interface::print)
1189         (meta . ((class . Item)
1190                  (interfaces . (note-name-interface
1191                                 text-interface
1192                                 font-interface))))))
1193
1194     (OctavateEight
1195      . (
1196         (self-alignment-X . 0)
1197         (break-visibility . ,begin-of-line-visible)
1198         (X-offset . ,(ly:make-simple-closure
1199                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))
1200                            ,(ly:make-simple-closure (list ly:self-alignment-interface::centered-on-x-parent)))))
1201         
1202         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1203         (stencil . ,ly:text-interface::print)
1204         (font-shape . italic)
1205         (staff-padding . 0.2)
1206         (font-size . -4)
1207         (meta . ((class . Item)
1208                  (interfaces . (text-interface
1209                                 self-alignment-interface
1210                                 side-position-interface
1211                                 font-interface))))))
1212
1213     (OttavaBracket
1214      . (
1215         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1216         (stencil . ,ly:ottava-bracket::print)
1217         (font-shape . italic)
1218         (shorten-pair . (0.0 . -0.6))
1219         (staff-padding . 1.0)
1220         (padding . 0.5)
1221         (minimum-length . 1.0)
1222         (dash-fraction . 0.3)
1223         (edge-height . (0 . 1.2))
1224         (direction . ,UP)
1225         (outside-staff-priority . 400)
1226         (meta . ((class . Spanner)
1227                  (interfaces . (ottava-bracket-interface
1228                                 horizontal-bracket-interface
1229                                 line-interface
1230                                 side-position-interface
1231                                 font-interface
1232                                 text-interface))))))
1233
1234     (PaperColumn
1235      . (
1236         (axes . (0))
1237         (allow-loose-spacing . #t)
1238         (before-line-breaking . ,ly:paper-column::before-line-breaking)
1239         (horizontal-skylines . ,ly:separation-item::calc-skylines)
1240         ;; (stencil . ,ly:paper-column::print)
1241         (X-extent . ,ly:axis-group-interface::width)
1242         
1243         ;; debugging
1244         ;;                       (font-size . -6) (font-name . "sans") (Y-extent . #f)
1245         (meta . ((class . Paper_column)
1246                  (interfaces . (paper-column-interface
1247                                 separation-item-interface
1248                                 axis-group-interface
1249                                 spaceable-grob-interface))))))
1250
1251     (ParenthesesItem
1252      . ((stencil . ,parentheses-item::print)
1253         (stencils . ,parentheses-item::calc-parenthesis-stencils)
1254         (font-size . -6)
1255         (padding . 0.2)
1256         (meta . ((class . Item)
1257                  (interfaces . (parentheses-interface font-interface))))
1258         ))
1259
1260     (HarmonicParenthesesItem
1261      . ((stencil . ,parentheses-item::print)
1262         (padding . 0)
1263         (stencils . ,parentheses-item::calc-angled-bracket-stencils)
1264         (meta . ((class . Item)
1265                  (interfaces . (parentheses-interface font-interface))))
1266         ))
1267     
1268     (PhrasingSlur
1269      . ((details . ,default-slur-details)
1270         (control-points . ,ly:slur::calc-control-points)
1271         (direction . ,ly:slur::calc-direction)
1272         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1273         (Y-extent . ,ly:slur::height)
1274         (stencil . ,ly:slur::print)                   
1275         (thickness . 1.1)
1276         (minimum-length . 1.5)
1277         (height-limit . 2.0)
1278         (ratio . 0.333)
1279         (cross-staff . ,ly:slur::calc-cross-staff)
1280         (meta . ((class . Spanner)
1281                  (interfaces . (slur-interface))))))
1282
1283
1284
1285     (PercentRepeat
1286      . (
1287         (springs-and-rods . ,ly:multi-measure-rest::set-spacing-rods)
1288         (stencil . ,ly:multi-measure-rest::percent)
1289         (slope . 1.0)
1290         (thickness . 0.48)
1291         (font-encoding . fetaMusic)
1292         (meta . ((class . Spanner)
1293                  (interfaces . (multi-measure-rest-interface
1294                                 font-interface
1295                                 percent-repeat-item-interface))))))
1296     (PercentRepeatCounter
1297      . (
1298         (stencil . ,ly:text-interface::print)
1299         (X-offset . ,(ly:make-simple-closure
1300                       `(,+ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-centered-on-y-parent))
1301                            ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)))))
1302         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1303         (self-alignment-X . 0)
1304         (direction . ,UP)
1305         (padding . 0.2)
1306         (staff-padding . 0.25)
1307         (font-size . -2) 
1308         (font-encoding . fetaNumber)
1309         (meta . ((class . Spanner)
1310                  (interfaces . (side-position-interface
1311                                 self-alignment-interface
1312                                 percent-repeat-item-interface
1313                                 font-interface
1314                                 text-interface))))))
1315
1316     ;; an example of a text spanner
1317     (PianoPedalBracket
1318      . (
1319         (stencil . ,ly:piano-pedal-bracket::print)
1320         (style . line)
1321         (bound-padding . 1.0)
1322         (direction . ,DOWN)
1323         (bracket-flare . (0.5 . 0.5))
1324         (edge-height . (1.0 . 1.0))
1325         (shorten-pair . (0.0 . 0.0))
1326         (thickness .  1.0)
1327         (meta . ((class . Spanner)
1328                  (interfaces . (line-interface
1329                                 piano-pedal-interface
1330                                 piano-pedal-bracket-interface))))))
1331
1332     (RehearsalMark
1333      . (
1334         (stencil . ,ly:text-interface::print)
1335         (X-offset . ,(ly:make-simple-closure
1336                       `(,+
1337                         ,(ly:make-simple-closure
1338                           (list ly:break-alignable-interface::self-align-callback))
1339                         ,(ly:make-simple-closure
1340                           (list ly:self-alignment-interface::x-aligned-on-self)))))
1341
1342         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1343         (extra-spacing-width . (+inf.0 . -inf.0))
1344         (self-alignment-X . 0)
1345         (direction . ,UP)
1346         (non-musical . #t)
1347         (font-size . 2)
1348         (baseline-skip . 2)
1349         (break-visibility . ,end-of-line-invisible)
1350         (break-align-symbols . (staff-bar clef))
1351         (padding . 0.8)
1352         (outside-staff-priority . 1500)
1353         (meta . ((class . Item)
1354                  (interfaces . (text-interface
1355                                 side-position-interface
1356                                 break-alignable-interface
1357                                 font-interface
1358                                 mark-interface
1359                                 self-alignment-interface))))))
1360
1361     (RepeatSlash
1362      . (
1363         (stencil . ,ly:percent-repeat-item-interface::beat-slash)
1364         (thickness . 0.48)
1365         (slope . 1.7)
1366         (meta . ((class . Item)
1367                  (interfaces . (rhythmic-grob-interface
1368                                 percent-repeat-item-interface))))))
1369
1370     (RepeatTie
1371      . (
1372         (stencil  . ,ly:tie::print)
1373         (control-points . ,ly:semi-tie::calc-control-points)
1374         (direction . ,ly:tie::calc-direction)
1375         (details . ((ratio . 0.333)
1376                     (height-limit . 1.0)))
1377         (thickness . 1.0)
1378         (head-direction . ,RIGHT)
1379         (meta . ((class . Item)
1380                  (interfaces . (semi-tie-interface))
1381                  ))
1382         ))
1383
1384     (RepeatTieColumn
1385      . (
1386         (X-extent . #f)
1387         (Y-extent . #f)
1388         (direction . ,ly:tie::calc-direction)
1389         (head-direction . ,ly:semi-tie-column::calc-head-direction)
1390         
1391         (positioning-done . ,ly:semi-tie-column::calc-positioning-done)
1392         (meta . ((class . Item)
1393                  (interfaces . (semi-tie-column-interface))
1394                  ))
1395         ))
1396
1397     (Rest
1398      . (
1399         (stencil . ,ly:rest::print)
1400         (duration-log . ,stem::calc-duration-log)
1401         (X-extent . ,ly:rest::width)
1402         (Y-extent . ,ly:rest::height)
1403         (Y-offset . ,ly:rest::y-offset-callback)
1404         (minimum-distance . 0.25)
1405         (meta . ((class . Item)
1406                  (interfaces . (font-interface
1407                                 rhythmic-head-interface
1408                                 rhythmic-grob-interface
1409                                 staff-symbol-referencer-interface
1410                                 rest-interface))))))
1411
1412     (RestCollision
1413      . (
1414         (minimum-distance . 0.75)
1415         (positioning-done . ,ly:rest-collision::calc-positioning-done)
1416         (meta . ((class . Item)
1417                  (interfaces . (rest-collision-interface))))))
1418
1419     (Script
1420      . (
1421         ;; don't set direction here: it breaks staccato.
1422
1423         ;; padding set in script definitions.
1424         (staff-padding . 0.25)
1425         (X-offset . ,script-interface::calc-x-offset)
1426         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1427         (side-axis . ,Y)
1428
1429         (stencil . ,ly:script-interface::print)
1430         (direction . ,ly:script-interface::calc-direction)
1431         (positioning-done . ,ly:script-interface::calc-positioning-done)
1432         (font-encoding . fetaMusic)
1433         (cross-staff . ,ly:script-interface::calc-cross-staff)
1434         (meta . ((class . Item)
1435                  (interfaces . (script-interface
1436                                 side-position-interface
1437                                 font-interface))))))
1438
1439     (ScriptColumn
1440      . (
1441         (before-line-breaking . ,ly:script-column::before-line-breaking)
1442         (meta . ((class . Item)
1443                  (interfaces . (script-column-interface))))))
1444     (ScriptRow
1445      . (
1446         (before-line-breaking . ,ly:script-column::row-before-line-breaking)
1447         (meta . ((class . Item)
1448                  (interfaces . (script-column-interface))))))
1449
1450     (SeparationItem
1451      . (
1452         (avoid-slur . inside)
1453         (X-extent . ,ly:axis-group-interface::width)
1454         (Y-extent . ,ly:axis-group-interface::height)
1455         (horizontal-skylines . ,ly:separation-item::calc-skylines)
1456         (stencil . ,ly:separation-item::print)
1457         (meta . ((class . Item)
1458                  (interfaces . (
1459                                 separation-item-interface))))))
1460
1461     (Slur
1462      . ((details . ,default-slur-details)
1463         (control-points . ,ly:slur::calc-control-points)
1464         (direction . ,ly:slur::calc-direction)
1465         (springs-and-rods . ,ly:spanner::set-spacing-rods)
1466         (Y-extent . ,ly:slur::height)
1467         (stencil . ,ly:slur::print)
1468         (thickness . 1.2)
1469         (line-thickness . 0.8)
1470         (minimum-length . 1.5)
1471         (height-limit . 2.0)
1472         (ratio . 0.25)
1473         (avoid-slur . inside)
1474         (cross-staff . ,ly:slur::calc-cross-staff)
1475         (meta . ((class . Spanner)
1476                  (interfaces . (slur-interface))))))
1477
1478     (SostenutoPedal
1479      . (
1480         (stencil . ,ly:text-interface::print)
1481         (direction . ,RIGHT)
1482         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1483         (extra-spacing-width . (+inf.0 . -inf.0))
1484         (padding . 0.0) ;; padding relative to SostenutoPedalLineSpanner
1485         (font-shape . italic)
1486         (self-alignment-X . 0)
1487         (meta . ((class . Item)
1488                  (interfaces . (text-interface
1489                                 self-alignment-interface
1490                                 piano-pedal-script-interface
1491                                 font-interface))))))
1492
1493     (SostenutoPedalLineSpanner
1494      . (
1495         (axes . (1))
1496         (Y-extent . ,ly:axis-group-interface::height)
1497         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1498         (side-axis . ,Y)
1499         (staff-padding . 1.0)
1500         (padding . 1.2)
1501         (minimum-space . 1.0)
1502         (direction . ,DOWN)
1503         (meta . ((class . Spanner)
1504                  (interfaces . (piano-pedal-interface
1505                                 axis-group-interface
1506                                 side-position-interface))))))
1507     (SpacingSpanner
1508      . (
1509         (springs-and-rods . ,ly:spacing-spanner::set-springs)
1510         (common-shortest-duration . ,ly:spacing-spanner::calc-common-shortest-duration)
1511         (average-spacing-wishes . #t)
1512         (shortest-duration-space . 2.0)
1513         (spacing-increment . 1.2)
1514         
1515         (base-shortest-duration . ,(ly:make-moment 3 16))
1516         (meta . ((class . Spanner)
1517                  (interfaces . (
1518                                 spacing-options-interface                               
1519                                 spacing-spanner-interface))))))
1520
1521     (SpanBar
1522      . (
1523         (break-align-symbol . staff-bar)
1524         (Y-extent . ())
1525         (layer . 0)
1526         (non-musical . #t)
1527         (stencil . ,ly:span-bar::print)
1528         (bar-size . ,ly:span-bar::calc-bar-size)
1529         (X-extent . ,ly:span-bar::width)
1530         (glyph-name . ,ly:span-bar::calc-glyph-name)
1531         (before-line-breaking . ,ly:span-bar::before-line-breaking)
1532
1533         ;; ugh duplication!
1534
1535         ;;
1536         ;; Ross. page 151 lists other values, we opt for a leaner look
1537         ;;
1538         (kern . 3.0)
1539         (thin-kern . 3.0)
1540         (hair-thickness . 1.6)
1541         (thick-thickness . 6.0)
1542         (meta . ((class . Item)
1543                  (interfaces . (span-bar-interface
1544                                 font-interface
1545                                 bar-line-interface))))))
1546
1547     (StanzaNumber
1548      . (
1549         (stencil . ,ly:text-interface::print)
1550         (font-series . bold)
1551         (padding . 1.0)
1552         (X-offset . ,ly:side-position-interface::x-aligned-side)
1553         (side-axis . ,X)
1554         (direction . ,LEFT)
1555         (meta . ((class . Item)
1556                  (interfaces . (side-position-interface
1557                                 stanza-number-interface
1558                                 text-interface
1559                                 font-interface))))))
1560
1561
1562     (StaffSpacing
1563      . (
1564         (non-musical . #t)
1565         (stem-spacing-correction . 0.4)
1566         (meta . ((class . Item)
1567                  (interfaces . (spacing-interface
1568                                 staff-spacing-interface))))))
1569
1570    
1571     (StaffSymbol
1572      . (
1573         (Y-extent . ,ly:staff-symbol::height)
1574         (stencil . ,ly:staff-symbol::print)
1575         (line-count . 5)
1576         (ledger-line-thickness . (1.0 . 0.1))
1577         (layer . 0)
1578         (meta . ((class . Spanner)
1579                  (interfaces . (staff-symbol-interface))))))
1580
1581     (Stem
1582      . (
1583         (direction . ,ly:stem::calc-direction)
1584         (duration-log . ,stem::calc-duration-log)
1585         (default-direction . ,ly:stem::calc-default-direction)
1586         (stem-end-position . ,ly:stem::calc-stem-end-position)
1587
1588         (neutral-direction . ,DOWN)
1589         (stem-info . ,ly:stem::calc-stem-info)
1590         (positioning-done . ,ly:stem::calc-positioning-done)
1591         (stencil . ,ly:stem::print)
1592         (X-extent . ,ly:stem::width)
1593         (Y-extent . ,ly:stem::height)
1594         (length . ,ly:stem::calc-length)
1595         (thickness . 1.3)
1596         (cross-staff . ,ly:stem::calc-cross-staff)
1597         (details
1598          . (
1599             ;; 3.5 (or 3 measured from note head) is standard length
1600             ;; 32nd, 64th flagged stems should be longer
1601             (lengths . (3.5 3.5 3.5 4.5 5.0))
1602
1603             ;; FIXME.  3.5 yields too long beams (according to Ross and
1604             ;; looking at Baerenreiter examples) for a number of common
1605             ;; boundary cases.  Subtracting half a beam thickness fixes
1606             ;; this, but the bug may well be somewhere else.
1607
1608             ;; FIXME this should come from 'lengths
1609             (beamed-lengths . (3.26 3.5 3.6))
1610
1611             ;; The 'normal' minima
1612             (beamed-minimum-free-lengths . (1.83 1.5 1.25))
1613                                         ;(beamed-minimum-free-lengths . (2.0 1.83 1.25))
1614
1615             ;; The 'extreme case' minima
1616             (beamed-extreme-minimum-free-lengths . (2.0 1.25))
1617
1618             ;; Stems in unnatural (forced) direction should be shortened by
1619             ;; one staff space, according to [Roush & Gourlay].
1620             ;; Flagged stems we shorten only half a staff space.
1621             (stem-shorten . (1.0 0.5))
1622
1623             ))
1624
1625         ;; We use the normal minima as minimum for the ideal lengths,
1626         ;; and the extreme minima as abolute minimum length.
1627
1628         (X-offset . ,ly:stem::offset-callback)
1629         (Y-offset . ,ly:staff-symbol-referencer::callback)
1630         (meta . ((class . Item)
1631                  (interfaces . (stem-interface
1632                                 font-interface))))))
1633
1634     (StemTremolo
1635      . (
1636         (Y-extent . ,ly:stem-tremolo::height)
1637         (X-extent . ,ly:stem-tremolo::width)
1638         (stencil . ,ly:stem-tremolo::print)
1639         (slope . ,ly:stem-tremolo::calc-slope)
1640         (beam-width . ,ly:stem-tremolo::calc-width) ; staff-space
1641         (style . ,ly:stem-tremolo::calc-style)
1642         (beam-thickness . 0.48) ; staff-space
1643         (meta . ((class . Item)
1644                  (interfaces . (stem-tremolo-interface))))))
1645
1646     (StringNumber
1647      . (
1648         (stencil . ,print-circled-text-callback)
1649         (text . ,string-number::calc-text)
1650         (padding . 0.5)
1651         (staff-padding . 0.5)
1652         (self-alignment-X . 0)
1653         (self-alignment-Y . 0)
1654         (script-priority . 100)
1655         (font-encoding . fetaNumber)
1656         (font-size . -5)                ; don't overlap when next to heads.
1657         (meta . ((class . Item)
1658                  (interfaces . (string-number-interface
1659                                 font-interface
1660                                 text-script-interface
1661                                 text-interface
1662                                 side-position-interface
1663                                 self-alignment-interface
1664                                 ))))))
1665     
1666     (StrokeFinger
1667      . (
1668         (stencil . ,ly:text-interface::print)
1669         (text . ,stroke-finger::calc-text)
1670         (digit-names . #("p" "i" "m" "a" "x"))
1671         (padding . 0.5)
1672         (staff-padding . 0.5)
1673         (self-alignment-X . 0)
1674         (self-alignment-Y . 0)
1675         (script-priority . 100)
1676         (font-shape . italic)
1677         (font-size . -4)                ; don't overlap when next to heads.
1678         (meta . ((class . Item)
1679                  (interfaces . (stroke-finger-interface
1680                                 font-interface
1681                                 text-script-interface
1682                                 text-interface
1683                                 side-position-interface
1684                                 self-alignment-interface
1685                                 ))))))
1686     
1687
1688     (SustainPedal
1689      . (
1690         (extra-spacing-width . (+inf.0 . -inf.0))
1691         (stencil . ,ly:sustain-pedal::print)
1692         (self-alignment-X . 0)
1693         (direction . ,RIGHT)
1694         (padding . 0.0)  ;; padding relative to SustainPedalLineSpanner
1695         (X-offset . ,ly:self-alignment-interface::x-aligned-on-self)
1696         (meta . ((class . Item)
1697                  (interfaces . (piano-pedal-interface
1698                                 text-interface
1699                                 self-alignment-interface
1700                                 piano-pedal-script-interface
1701                                 font-interface))))))
1702
1703     (SustainPedalLineSpanner
1704      . (
1705         (axes . (1))
1706         (Y-extent . ,ly:axis-group-interface::height)
1707         (Y-offset . ,ly:side-position-interface::y-aligned-side)
1708         (side-axis . ,Y)
1709         (padding . 1.2)
1710         (staff-padding . 1.2)
1711         (minimum-space . 1.0)
1712         (direction . ,DOWN)
1713         (meta . ((class . Spanner)
1714                  (interfaces . (piano-pedal-interface
1715                                 axis-group-interface
1716                                 side-position-interface))))))
1717
1718     (System
1719      . (
1720         (axes . (0 1))
1721         (X-extent . ,ly:axis-group-interface::width)
1722         (Y-extent . ,ly:axis-group-interface::height)
1723         (vertical-skylines . ,ly:axis-group-interface::calc-skylines)
1724         (max-stretch . ,ly:axis-group-interface::calc-max-stretch)
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         (font-encoding . fetaNumber)
2104         (thickness . 1.6)  ;;  line-thickness
2105         (edge-height . (2.0 . 2.0)) ;; staff-space;
2106         (font-size . -4)
2107         (direction . ,UP)
2108         (meta . ((class . Spanner)
2109                  (interfaces . (volta-bracket-interface
2110                                 horizontal-bracket-interface                            
2111                                 line-interface
2112                                 text-interface
2113                                 side-position-interface
2114                                 font-interface)))
2115               )))
2116
2117     (VoltaBracketSpanner
2118      . (        
2119         (axes . (1))
2120         (side-axis . ,Y)
2121         (direction . ,UP)
2122         (padding . 1)
2123         (Y-offset . ,ly:side-position-interface::y-aligned-side)
2124         (outside-staff-priority . 100)
2125         (Y-extent . ,ly:axis-group-interface::height)
2126         (X-extent . ,ly:axis-group-interface::width)
2127         (no-alignment . ,#t)
2128         (meta . ((class . Spanner)
2129                  (interfaces . (side-position-interface
2130                                 axis-group-interface)))
2131               )))
2132
2133     (VoiceFollower
2134      . (
2135         (style . line)
2136         (gap . 0.5)
2137         (non-musical . #t)
2138         (X-extent . #f)
2139         (Y-extent . #f)
2140         (bound-details . ((right . ((attach-dir .  ,CENTER)
2141                                     (padding . 1.5)
2142                                       ))
2143                           (left . ((attach-dir .  ,CENTER)
2144                                    (padding . 1.5)
2145                                       ))
2146                           ))
2147         (stencil . ,ly:line-spanner::print)
2148         (left-bound-info . ,ly:line-spanner::calc-left-bound-info)
2149         (right-bound-info . ,ly:line-spanner::calc-right-bound-info)
2150         (meta . ((class . Spanner)
2151                  (interfaces . (line-spanner-interface
2152                                 line-interface))))
2153         ))
2154
2155 ))
2156
2157 (define (completize-grob-entry x)
2158   "Transplant assoc key into 'name entry of 'meta of X.  Set interfaces for Item, Spanner etc.
2159 "
2160   ;;  (display (car x))
2161   ;;  (newline)
2162   (let* ((name-sym  (car x))
2163          (grob-entry (cdr x))
2164          (meta-entry (cdr (assoc 'meta grob-entry)))
2165          (class (cdr (assoc 'class meta-entry)))
2166          (ifaces-entry
2167           (cdr (assoc 'interfaces meta-entry))))
2168
2169     (cond
2170      ((eq? 'Item class)
2171       (set! ifaces-entry (cons 'item-interface ifaces-entry)))
2172      ((eq? 'Spanner class)
2173       (set! ifaces-entry (cons 'spanner-interface ifaces-entry)))
2174      ((eq? 'Paper_column class)
2175       (set! ifaces-entry (cons 'item-interface
2176                                (cons 'paper-column-interface ifaces-entry))))
2177      ((eq? 'System class)
2178       (set! ifaces-entry (cons 'system-interface
2179                                (cons 'spanner-interface ifaces-entry))))
2180      (else
2181       (ly:warning "Unknown class ~a" class)))
2182
2183     (set! ifaces-entry (uniq-list (sort ifaces-entry symbol<?)))
2184     (set! ifaces-entry (cons 'grob-interface ifaces-entry))
2185
2186     (set! meta-entry (assoc-set! meta-entry 'name name-sym))
2187     (set! meta-entry (assoc-set! meta-entry 'interfaces
2188                                  ifaces-entry))
2189     (set! grob-entry (assoc-set! grob-entry 'meta meta-entry))
2190     (cons name-sym grob-entry)))
2191
2192 (set! all-grob-descriptions (map completize-grob-entry all-grob-descriptions))
2193
2194 ;;  (display (map pair? all-grob-descriptions))
2195
2196 ;; make sure that \property Foo.Bar =\turnOff doesn't complain
2197
2198 (map (lambda (x)
2199        ;; (display (car x)) (newline)
2200
2201        (set-object-property! (car x) 'translation-type? list?)
2202        (set-object-property! (car x) 'is-grob? #t))
2203      all-grob-descriptions)
2204
2205 (set! all-grob-descriptions (sort all-grob-descriptions alist<?))
2206
2207 (define pure-print-callbacks
2208   (list
2209    print-circled-text-callback
2210    lyric-text::print
2211    ly:arpeggio::print
2212    ly:arpeggio::brew-chord-bracket
2213    ly:bar-line::print
2214    ly:note-head::print
2215    ly:dots::print
2216    ly:clef::print
2217    ly:text-interface::print
2218    ly:script-interface::print))
2219
2220 ;; ly:grob::stencil-extent is safe iff the print callback is safe too
2221 (define (pure-stencil-height grob start stop)
2222   (let ((sten (ly:grob-property-data grob 'stencil)))
2223     (if (or
2224          (ly:stencil? sten)
2225          (memq sten pure-print-callbacks))
2226         (ly:grob::stencil-height grob)
2227         '(0 . 0))))
2228
2229 (define pure-conversions-alist
2230   `(
2231     (,ly:accidental-interface::height . ,ly:accidental-interface::pure-height)
2232     (,ly:arpeggio::height . ,ly:arpeggio::pure-height)
2233     (,ly:slur::outside-slur-callback . ,ly:slur::pure-outside-slur-callback)
2234     (,ly:stem::height . ,ly:stem::pure-height)
2235     (,ly:rest::height . ,ly:rest::pure-height)
2236     (,ly:grob::stencil-height . ,pure-stencil-height)
2237     (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)
2238     (,ly:axis-group-interface::height . ,ly:axis-group-interface::pure-height)
2239     (,ly:hara-kiri-group-spanner::y-extent . ,ly:hara-kiri-group-spanner::pure-height)
2240     (,ly:slur::height . ,ly:slur::pure-height)
2241     (,ly:side-position-interface::y-aligned-side . ,ly:side-position-interface::pure-y-aligned-side)))
2242
2243 (define pure-functions
2244   (list
2245    ly:staff-symbol-referencer::callback
2246    ly:staff-symbol::height))
2247
2248 (define-public (pure-relevant? grob)
2249   (let ((extent-callback (ly:grob-property-data grob 'Y-extent)))
2250     (not (eq? #f
2251               (or
2252                (pair? extent-callback)
2253                (memq extent-callback pure-functions)
2254                (and
2255                 (pair? (assq extent-callback pure-conversions-alist))
2256                 (begin
2257                   (or
2258                    (not (eq? extent-callback ly:grob::stencil-height))
2259                    (memq (ly:grob-property-data grob 'stencil) pure-print-callbacks)
2260                    (ly:stencil? (ly:grob-property-data grob 'stencil))
2261
2262                    ))))))))
2263
2264 (define-public (call-pure-function unpure args start end)
2265   (if (ly:simple-closure? unpure)
2266       (ly:eval-simple-closure (car args) unpure start end)
2267       (if (not (procedure? unpure))
2268           unpure
2269           (if (memq unpure pure-functions)
2270               (apply unpure args)
2271               (let ((pure (assq unpure pure-conversions-alist)))
2272                 (if pure
2273                     (apply (cdr pure)
2274                            (append
2275                             (list (car args) start end)
2276                             (cdr args)))))))))