From 82e74a9fbd7cde8bb2b2a0c2d2ee081bc8951afa Mon Sep 17 00:00:00 2001 From: Devon Schudy Date: Wed, 26 Mar 2014 15:04:08 -0400 Subject: [PATCH] Warn when \time is used in mid-measure, and reset measurePosition. This makes issues 3696 and 3888 less mysterious. --- input/regression/time-signature-midmeasure.ly | 28 +++++++++++++++++++ scm/define-music-callbacks.scm | 14 +++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 input/regression/time-signature-midmeasure.ly diff --git a/input/regression/time-signature-midmeasure.ly b/input/regression/time-signature-midmeasure.ly new file mode 100644 index 0000000000..10b5891100 --- /dev/null +++ b/input/regression/time-signature-midmeasure.ly @@ -0,0 +1,28 @@ +\version "2.19.4" + +\header { + texidoc = "Time signature changes in midmeasure generate warnings, +except in an anacrusis or when @code{ignoreBarChecks} is true. +@code{measurePosition} is reset to 0, so a full measure follows, regardless +of the original position. + +This example should end at bar 3, with no barline before the 2/4." +} + +#(ly:expect-warning (_ "\\time in mid-measure at 1/4")) + +\score { + \relative { + \override Score.BarNumber.break-visibility = #all-visible + \partial 8 \time 2/4 + a'8 | d4 + \time 6/8 \partial 4. + cis8 b a | g4. \barNumberCheck 2 + \set Timing.ignoreBarChecks = ##t + \time 12/8 + fis4. e d + \time 2/4 + \set Timing.ignoreBarChecks = ##f + a'2 | \barNumberCheck 3 + } +} diff --git a/scm/define-music-callbacks.scm b/scm/define-music-callbacks.scm index 60d7d35124..e9fe53eb1b 100644 --- a/scm/define-music-callbacks.scm +++ b/scm/define-music-callbacks.scm @@ -102,7 +102,19 @@ to be used by the sequential-iterator" structure)) (beaming-exception (beam-exceptions fraction time-signature-settings)) - (new-measure-length (ly:make-moment num den))) + (new-measure-length (ly:make-moment num den)) + (pos (ly:context-property context 'measurePosition))) + ;;\time is OK at a negative measurePosition (after \partial), + ;;but at a positive position it's probably a mistake, so warn + ;;(like a barcheck) and reset it to 0 to prevent errors. + (if (> (ly:moment-main pos) 0) + (begin + (if (not (ly:context-property context 'ignoreBarChecks #f)) + (ly:music-warning music + (_ "\\time in mid-measure at ~A") + (ly:moment-main pos))) + (ly:context-set-property! + context 'measurePosition (ly:make-moment 0)))) (ly:context-set-property! context 'timeSignatureFraction fraction) (ly:context-set-property! -- 2.39.2