#(set-object-property! 'staffAnnotation 'translation-type? markup?) #(set-object-property! 'staffAnnotationBreakVisibility 'translation-type? vector?) #(define (staff-annotation-engraver context) (let* ((last-annot '())) (make-engraver (acknowledgers ((bar-line-interface engraver grob source-engraver) (let* ((annot (ly:context-property context 'staffAnnotation)) (break-visibility (ly:context-property context 'staffAnnotationBreakVisibility begin-of-line-visible))) (if (markup? annot) (let ((grob (ly:engraver-make-grob engraver 'RehearsalMark '()))) (ly:grob-set-property! grob 'break-visibility break-visibility) (ly:grob-set-property! grob 'text annot) (ly:grob-set-property! grob 'self-alignment-X LEFT)))))) ((process-music engraver) (let* ((annot (ly:context-property context 'staffAnnotation))) (if (and (markup? annot) (not (equal? annot last-annot))) (let ((grob (ly:engraver-make-grob engraver 'RehearsalMark '())) (br-grob (ly:engraver-make-grob engraver 'RehearsalMark '()))) (ly:grob-set-property! grob 'break-visibility center-visible) (ly:grob-set-property! grob 'text annot) (ly:grob-set-property! grob 'self-alignment-X LEFT) (ly:grob-set-property! grob 'non-musical (equal? (ly:context-property context 'measurePosition) (ly:make-moment 0))) (ly:grob-set-property! br-grob 'break-visibility end-of-line-visible) (ly:grob-set-property! br-grob 'text (markup #:concat ("(" annot ")"))) (ly:grob-set-property! br-grob 'self-alignment-X RIGHT))) (set! last-annot annot)))))) \layout { \context { \Staff \consists #staff-annotation-engraver } } { c'1 \set Staff.staffAnnotation = "a 2" 1 \break 1 1 1 \break 1 1 \set Staff.staffAnnotation = "a 3" 1 \break 1 \set Staff.staffAnnotation = "a 4" \break 1 2 \set Staff.staffAnnotation = "a 42" 2 1 \unset Staff.staffAnnotation \break 1 }