lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

cadenzaToMusic function, odd behavior causing barcheck failures


From: James Harkins
Subject: cadenzaToMusic function, odd behavior causing barcheck failures
Date: Mon, 28 Jul 2014 23:46:55 -0400
User-agent: Trojita/v0.4.1-obs-36605d4; Qt/4.8.1; X11; Linux; Ubuntu 12.04.4 LTS

Hi,

Some time ago, a user here gave me a "cadenzaToMusic" function, which could stretch rests in non-cadenza parts to match the duration of a cadenza. (That's because I was having problems with compressing the cadenza music to fit in a normal-length bar.)

I've used it in a couple of pieces and it's worked beautifully so far, but failed in the case below. I expect to get:

(whole rest, fermata) | 2/4 R2 | 6/8 (next section)

Instead, I get

(whole rest, fermata) | 2/4 R2 ...

... and here, the 6/8 appears in the middle of the bar. It looks like the barlines are calculated as if the 2/4 bar contained three quarters.

The issue doesn't reproduce in two cases:

- If I replace the \cadenzaToMusic in the \score block with rests adding up to the right duration, or

- If I put the part with the cadenza notes (with *no* \cadenzaToMusic) in the lowest staff. (I can't do that b/c it's a clarinet cadenza and the piece also uses bassoon.)

I'm really quite perplexed why this is happening. Can someone take a look?

Thanks,
hjh


\language "english"
\version "2.18.2"

cadenzaToMusic =
#(define-music-function (parser location cadenzaMusic music)
  (ly:music? ly:music?)
  "Adjust the length of `music and the measureLength, to fit the length of
`cadenzaMusic"
  (let* ((clen (ly:music-length cadenzaMusic))
         (mlen (ly:music-length music))
         (factor (ly:moment-div clen mlen))
         (compressed (ly:music-compress music factor)))
    ;; (format #t "factor : ~a\n" factor)
    #{
      \set Timing.measureLength = $clen
      $compressed
      \unset Timing.measureLength
    #}))

clarCadenzaC = { \cadenzaOn \repeat unfold 31 r8 \cadenzaOff }

globalB = {
 \time 4/4
 \cadenzaOn \cadenzaToMusic \clarCadenzaC s1 \cadenzaOff
 \bar "|"
 \time 2/4 s2
 \time 6/8 s2.
}

\score { \new Staff <<
   \globalB
   \relative c' {
     \cadenzaOn

% use the following line: barcheck failed, and 6/8 meter is in the wrong place
     \cadenzaToMusic \clarCadenzaC r1\fermata

% use the following line instead (comment the previous one), no problem
     %r8 \repeat unfold 15 { r4 }  % = 31 eighth notes

     \cadenzaOff
     R2
     cs8 d e cs4.
   }
 >>
}




reply via email to

[Prev in Thread] Current Thread [Next in Thread]