> > No MWE for now but will provide if needed.
> Can you think of a case where it wouldn't be needed?

Silly me :-)

\version "2.25.8"

tempoChange =
#(define-music-function (interval endscale thenscale music)
   (ly:duration? scale? (scale? 1) ly:music?)
   "Make a gradual tempo change over @var{music}, essentially changing
speed after
every duration of @var{interval}, approaching a factor of speed of
@var{endscale}
compared to the start.  Afterwards, tempo is switched to @var{thenscale} of the
original speed (default 1).  If @var{thenscale} is 0, the speed reached at the
end is just maintained and can be overriden with an explicit @samp{\\tempo}
command if required."
   (define (scaletempo oldscale newscale)
     (make-apply-context
      (lambda (ctx)
        (set! (ly:context-property ctx 'tempoWholesPerMinute)
              (ly:moment-mul (ly:context-property ctx 'tempoWholesPerMinute)
                             (ly:make-moment (/ newscale oldscale)))))))

   (let* ((muslen (ly:moment-main (ly:music-length music)))
          (intlen (ly:moment-main (ly:duration-length interval)))
          (steps (/ muslen intlen))
          (endfactor (scale->factor endscale))
          (thenfactor (scale->factor thenscale)))
     (make-simultaneous-music
      (list music
            (context-spec-music
             (make-sequential-music
              (let loop ((rsteplst (iota (1+ steps) endfactor (/ (- 1
endfactor) steps)))
                         (res (if (positive? thenfactor)
                                  (list (scaletempo endfactor thenfactor))
                                  (list))))
                (if (null? (cdr rsteplst))
                    res
                    (loop (cdr rsteplst)
                          (cons* (scaletempo (cadr rsteplst) (car rsteplst))
                                 (make-skip-music (ly:make-duration 0 0 intlen))
                                 res)))))
             'Score)))))

music = {
  c'8 d' e' f' g' a' |
  b' c'' b' a' g' f' |
}
structure = {
  \time 6/8
  \tempo 4. = 100
  \tempoChange 8 64/128 0 {
    s2. |
  }
}
\score {
  \new Voice << \music \structure >>
  \layout {}
  \midi {}
}

But, as you could expect, it works flawlessly (Thus the need for a MnWE).
Scaling down this sketchy-arachnid code (full symphonic+chorus) of
mine will take some time though, but, I _will_ survive.

-- 
Pierre-Luc Gauthier

Reply via email to