Gianmaria Lari <address@hidden> writes:
> On Tue, 26 Jun 2018 at 10:47, David Kastrup <address@hidden> wrote:
>
>> Gianmaria Lari <address@hidden> writes:
>>
>> > For this I thought to write a substitution function etc. Something like
>> > this (it doesn't compile):
>> >
>> > \version "2.19.81"
>> > myScore =
>> > #(define-void-function (music) (ly:music?)
>> > (let (myRests #{ \time 3/4 r4 r r #} ) (ticktock #{ \time 3/4 hihat
>> > bassdrum bassdrum #}))
>> > #{
>> > \score {
>> > <<
>> > \new Staff {\myRests $music}
>> > \new DrumStaff { \ticktock}
>> > >>
>> > \layout{} \midi{} } #})
>> >
>> > music = {\time 3/4 a b c'}
>> >
>> > \myScore \music
>> >
>> > The "let" part is not correct. I don't know how to define variable
>> > containing lilypond code using let.
>>
>> How about copy&paste from working code then?
>>
>> The first argument of "let" is a list (parenthesized) of variable
>> bindings. Each binding has the form (var value) so in general let
>> _alyways_ starts (the exception being named let, but that's a different
>> beast)
>>
>> (let ((
>>
>> and you are missing the second paren. Copying or imitating _any_
>> working let would have worked here.
>>
>
> My apologies David and thank you for your help.
> But I also wanted to know if the direction I have taken was correct or
> completely wrong....
Well, it's a void function you use here, not a scheme function. Once it
works, it will create a score and throw it away.
Oh, you're right! So here it is the code where I fixed the function issue. It compiles.
\version "2.19.82"
#(define myRests #{ \time 3/4 r4 r r #} )
#(define ticktock #{ \drummode {\time 3/4 hihat4 bassdrum bassdrum} #} )
myScore =
#(define-scheme-function (music) (ly:music?)
#{
\score {
<<
\new Staff {\myRests $music }
\new DrumStaff { \ticktock}
>>
\layout{} \midi{} } #})
music = {\time 3/4 a b c'}
\myScore \music
Now in the following example I tried to put myRests and ticktock inside myScore. Because I know I could, I tried using nested define. It works ok.
\version "2.19.82"
myScore =
#(define-scheme-function (music) (ly:music?)
(define myRests #{ \time 3/4 r4 r r #} )
(define ticktock #{ \drummode {\time 3/4 hihat4 bassdrum bassdrum} #} )
#{
\score {
<<
\new Staff { $myRests $music }
\new DrumStaff { $ticktock }
>>
\layout{} \midi{} } #})
music = {\time 3/4 a b c'}
\myScore \music
And finally with let. It works ok.
\version "2.19.82"
myScore =
#(define-scheme-function (music) (ly:music?)
(let ((myRests #{ \time 3/4 r4 r r #} )
(ticktock #{ \drummode {\time 3/4 hihat4 bassdrum bassdrum} #} ))
#{
\score {
<<
\new Staff { $myRests $music }
\new DrumStaff { $ticktock }
>>
\layout{} \midi{} } #}))
music = {\time 3/4 a b c'}
\myScore \music
I have to say I have not been able to make it working until few minutes ago. I was using let similarly to the nested define. I was closing the parenthese of let command.... like this:
(define-scheme-function .....
(let ..... )
( .... body of define ..... )
That way the scope of the variable defined with let was not available inside the body of define.
Thank you for the help!
Now I will try to generate myRests and ticktock automatically according time defined in $music.
g.