Dear Ponderers,

so far, I was completely satisfied with out-of-the box lilypond and rarely used anything involving scheme. Mainly because, I find this language very counter-intuitive, but that's maybe because I code in C-like languages all the time.

Anyway, my project was to make me a function with which I could switch repeats from "volta" to "unfold" variants - in scores I need to have the unfold variant, but for some instruments it would be convenient to have long but repeating parts not unfolded but in volta brackets with an indication of the number of repetitions.

As a very simple solution, I came up with this (in real life, the scheme is in a separate file, but this seems to make no difference here ...):


--------------------

\version "2.19"

useRepeatVolta = #(define urv #t)
useRepeatUnfold = #(define urv #f)

unfoldOrRepeat =
#(define-music-function (parser location n m) (integer? ly:music?)

   (define nString (number->string n))

   (if urv
       #{
         <>^\markup{ \box{ \concat{ $nString "x" } } }
         \repeat volta $n { $m }
       #}

       #{
         \repeat unfold $n { $m }
       #}
       )
   )


\score {

  \new Staff {

    c'''4 4 4 4

    \barNumberCheck #2
    % \useRepeatVolta     % <-- doesn't work
    #(define urv #t)    % <-- works
    \unfoldOrRepeat 8 { c''4 4 4 4  }

    \barNumberCheck #10
    #(define urv #f)
    \unfoldOrRepeat 8 { c'4 4 4 4  }
  }
}


--------------------

which sort of works. But not really, because

(1) I have included two procedures for switching between "volta" and "unfold". They don't really work. If I use the #(define urv #t) directly, it works as expected. I don't know why ...

(2) For this function to work properly, I'll need to calculate the bar number in the "volta" case or no bar number checks will make sense anymore.
So, basically, after the \repeat volta line, there should be something like

         \set Score.currentBarNumber =
           #(+
               (* (- n 1) [LENGTH OF m in BARS] )
               (ly:context-property 'Score 'currentBarNumber)
            )

This doesn't work since, I don't know how to get the length of music variable m, and I also don't understand how to return the current bar number of the score context.

There was a recent thread

http://lilypond.1069038.n5.nabble.com/get-current-bar-number-td211064.html

that dealt with bar numbers in scheme as well, so I knew that simply using (ly:context-property 'Score 'currentBarNumber) wouldn't work. I tried to fiddle around with the code of that other thread, but the hard truth is, I have no clue what Scheme is all about.

Can anyone point me to an example where I can see how this is done?

Thanks a lot!
Robert



_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to