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