lilypond-user
[Top][All Lists]
Advanced

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

Re: rall. autocalculation function in Scheme


From: Adam M. Griggs
Subject: Re: rall. autocalculation function in Scheme
Date: Mon, 6 Feb 2023 22:09:15 +0900

Thank you Valentin. This is great. Works perfectly and also instructive for a relative newbie to Scheme.

On Mon, 6 Feb 2023 at 16:49, Valentin Petzel <valentin@petzel.at> wrote:
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 <adammgriggs@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!


reply via email to

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