\version "2.20.0" #(define-event-class 'tempo-span-event 'span-event) #(define (add-grob-definition grob-name grob-entry) (let* ((meta-entry (assoc-get 'meta grob-entry)) (class (assoc-get 'class meta-entry)) (ifaces-entry (assoc-get 'interfaces meta-entry))) (set-object-property! grob-name 'translation-type? ly:grob-properties?) (set-object-property! grob-name 'is-grob? #t) (set! ifaces-entry (append (case class ((Item) '(item-interface)) ((Spanner) '(spanner-interface)) ((Paper_column) '((item-interface paper-column-interface))) ((System) '((system-interface spanner-interface))) (else '(unknown-interface))) ifaces-entry)) (set! ifaces-entry (uniq-list (sort ifaces-entry symbolspanner-text (lambda (grob) (let* ((bound-left (ly:spanner-bound grob LEFT)) (bound-right (ly:spanner-bound grob RIGHT)) (bound-left-ext (ly:grob-extent bound-left bound-left X)) (bound-left-center (interval-center bound-left-ext)) (bound-right-ext (ly:grob-extent bound-right bound-right X)) (bound-right-center (interval-center bound-right-ext)) (bound-details (ly:grob-property grob 'bound-details)) (details-right (assoc-get 'right bound-details)) (details-left (assoc-get 'left bound-details)) (text-padding-left (assoc-get 'text-padding details-left)) (text-padding-right (assoc-get 'text-padding details-right)) (left-bound-text (ly:grob-property bound-left 'text)) (right-bound-text (ly:grob-property bound-right 'text))) (ly:grob-set-nested-property! grob '(bound-details left text) #{ \markup { #left-bound-text \hspace #text-padding-left } #}) (ly:grob-set-nested-property! grob '(bound-details right text) #{ \markup { \hspace #text-padding-right #right-bound-text } #}) (ly:grob-set-nested-property! grob '(bound-details left padding) (- bound-left-center)) (ly:grob-set-nested-property! grob '(bound-details right padding) (+ text-padding-right bound-right-center)) (ly:side-position-interface::move-to-extremal-staff grob)))) #(add-grob-definition 'TempoSpanner `((after-line-breaking . ,tempo-text->spanner-text) (bound-details . ((left . ((Y . 0) (padding . 0.25) (text-padding . 0.4) (stencil-offset . (0 . -0.5)) )) (right . ((Y . 0) (padding . 0.25) (stencil-offset . (0 . -0.5)) (text-padding . 0.4) )) )) (dash-fraction . 0.4) (dash-period . 2.0) (direction . ,UP) (font-shape . upright) (left-bound-info . ,ly:line-spanner::calc-left-bound-info) (outside-staff-priority . 350) (padding . 0.8) (right-bound-info . ,ly:line-spanner::calc-right-bound-info) (staff-padding . 0.8) (stencil . ,ly:line-spanner::print) (style . dashed-line) (vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil) (meta . ((class . Spanner) (interfaces . (font-interface line-interface line-spanner-interface outside-staff-interface side-position-interface)))))) #(define scheme-event-spanner-types '( (TempoSpanEvent . ((description . "Used to signal where scheme text spanner brackets start and stop.") (types . (tempo-span-event span-event event)) )) )) #(set! scheme-event-spanner-types (map (lambda (x) (set-object-property! (car x) 'music-description (cdr (assq 'description (cdr x)))) (let ((lst (cdr x))) (set! lst (assoc-set! lst 'name (car x))) (set! lst (assq-remove! lst 'description)) (hashq-set! music-name-to-property-table (car x) lst) (cons (car x) lst))) scheme-event-spanner-types)) #(set! music-descriptions (append scheme-event-spanner-types music-descriptions)) #(set! music-descriptions (sort music-descriptions alist>