Warn about missing repeat

Revision as of 11:29, 3 December 2025 by Lemzwerg (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

When typesetting orchestral pieces, you will not discover if a repeat is missing in one of the parts if you proof read the score, since the repeat will be typeset anyway if it's included in some other parts. The following engraver (generously contributed in https://lists.gnu.org/archive/html/lilypond-user/2025-11/msg00172.html) automatically detects such missing repeats and issues a warning like

warning: Global repeat not stated in context
  #<Context Staff=lower (#<Context Voice () >) >

The definition of the Repeat_warn_engraver and the lines adding it to the Staff context can preferably be placed in a separate file to be \included in your music files as part of the proof reading process.

\version "2.24"

#(define Repeat_warn_engraver
   (let
    ((repeat-start-anywhere? #f)) ; shared across all instances
    (lambda (ctx)
      (let ((repeat-start-local? #f)) ; local for one context
        (make-engraver
         ((start-translation-timestep engraver)
          (set! repeat-start-anywhere? #f))
         (listeners
          ((volta-repeat-start-event engraver event)
           (set! repeat-start-anywhere? #t)
           (set! repeat-start-local? #t)))
         ((stop-translation-timestep engraver)
          (if (and repeat-start-anywhere?
                   (not repeat-start-local?))
              (ly:warning "Global repeat not stated in context ~a" ctx))
          (set! repeat-start-local? #f)))))))

\layout {
  \context {
    \Staff
    \consists #Repeat_warn_engraver
  }
}

<<
  \new Staff = upper {
    c'1
    \repeat volta 2 { c' c' c' }
    \repeat volta 2 {
      d'
    }
  }
  \new Staff = lower {
    c'1
    \repeat volta 2 { c' c' c' }
    % \repeat volta 2 { % Typo! Missing repeat, which normally is not detected
    e'
    % }
  }
>>