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