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