Hello Adam, Using #{ ... #} does not magically register the music or something. A scheme expression such as (begin ...) will evaluate to the last statement. So
(begin #{ ... #} (enact-tempo-decrease ...)) will simply evaluate to the second part, thus always to #{#}. What you do in fact need to do is to gather the music created thus into a list, most cleanly by using a separate recursion function (so (define-music- function (...) (...) (define (rec steps) ...) #{ #@(rec steps) #} )) or by using (make-music 'SequentialMusic 'elements (cons #{ ... #} (ly:music-property (enact-tempo-decrease ...) 'elements)) But as I already said in my previous response you can do this easier using map. With regards to that version: To handle negative values simply add a filter call: myRall = #(define-music-function (steps duration) (integer? ly:duration?) (let* ((tempi-list (iota steps 100 -1)) (tempi-list (filter (lambda (x) (> x 0)) tempi-list)) (tempi-mus (map (lambda (t) #{ \tempo 4 = $t s$duration #}) tempi- list))) #{ #@tempi-mus #})) Cheers, Valentin Am Montag, 6. Februar 2023, 07:50:02 CET schrieb Adam M. Griggs: > I've given it some more work. The \repeat construct is gone, and the > displayed messages indicate that my recursion is working correctly. > > Metronome marks are not yet printed, however. What am I missing? Also, I'm > getting a wrong type argument error message when I try to (let* > (current-tempo (car tempo-list))). I feel like I'm almost there though. > > Code attached, and thanks again. > > On Mon, 6 Feb 2023 at 14:19, Adam M. Griggs <adammgri...@gmail.com> wrote: > > Hello list, > > > > I'm trying to create a Scheme function that will automatically calculate > > and enact a *rall*. as a sequence of \tempo assignments. I am aware of > > the basic *rall*., *rit*., and *accel*. functions in "articulate.ly" but > > I wanted something I have a little more control over. > > > > I need help, and I don't know if it's just in the implementation details > > or my overall approach to the problem. > > > > For now, it's just a *rall*. The algorithm describing the rate of > > slowdown is extremely basic but that can be adjusted later. > > > > My approach so far has been to create a list of values starting at 100 > > (let's assume percentages of the initial tempo and work that in later) and > > then have them trickle down. Using #(display ...), I see this is working > > just fine. > > > > Clearly my \repeat call isn't appropriate here and I should replace it > > with a recursive function call containing just its body (the {\tempo 4 = > > ... \skip ...} part). And I'm sure I'm not really going to get anywhere > > with #@tempi-list but I hope it communicates what I'm aiming for. I've > > been > > playing with this for a few hours but I haven't been able to get the parts > > to mesh together. I could keep stabbing at it, or ask for help here. > > > > Code attached, and thank you!
signature.asc
Description: This is a digitally signed message part.