> “This sounds like a job for… Custom Engraver!!”  :)

\version "2.24.2"

#(define (Custom_engraver!! context)
   (define (format-time seconds)
     (let ((minutes (euclidean-quotient seconds 60))
           (rest (euclidean-remainder seconds 60)))
       (string-append (if (zero? minutes) "" (format #f "~am" minutes))
                      (format #f "~as" (round rest)))))
   (let ((wholes-per-minute 15)
         (last-time ZERO-MOMENT)
         (total-time 0)
         (marks '()))
     (make-engraver
      ((process-music engraver)
       (let* ((new-time (ly:context-current-moment context))
              (time-delta (ly:moment-main (ly:moment-sub new-time last-time)))
              (new-wholes-per-minute
                (and=> (ly:context-property context 'tempoWholesPerMinute #f)
                       ly:moment-main)))
         (set! total-time
               (+ total-time (* 60 (/ time-delta wholes-per-minute))))
         (set! last-time new-time)
         (when new-wholes-per-minute
           (set! wholes-per-minute new-wholes-per-minute))))
      (acknowledgers
       ((text-mark-interface engraver grob source-engraver)
        (set! marks (cons grob marks))))
      ((process-acknowledged engraver)
       (for-each (lambda (grob)
                   (when (assq-ref (ly:grob-property grob 'details) 'time-mark)
                     (ly:grob-set-property! grob 'text (format-time 
total-time))))
                 marks)
       (set! marks '())))))

\layout {
  \context {
    \Score
    \consists #Custom_engraver!!
  }
}

timeMark = \tweak details.time-mark ##t \tweak color "red" \textEndMark 
"Abracadabra"

{
  c'1
  \timeMark
  \tempo 4 = 120
  c'4 8. 16 2
  \timeMark
  \tempo 4 = 180
  c'2 2
  \timeMark
  \repeat unfold 180 c'4
  \timeMark
}

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to