lilypond-user
[Top][All Lists]
Advanced

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

Re: Defining variables mid-stream in a music expression using tags.


From: Valentin Petzel
Subject: Re: Defining variables mid-stream in a music expression using tags.
Date: Wed, 17 May 2023 22:30:50 +0200

Also gotta say that this is most likely not a good thing to do. Changing 
global scope variables like that can lead to confusing behaviour. Maybe if you 
can elaborate on what you want to achieve we might find a more ideomatic way to 
get there.

Am Mittwoch, 17. Mai 2023, 22:24:54 CEST schrieb Valentin Petzel:
> Hello David,
> 
> there is some confusing going on here about how certain things are
> evaluated. When you do
> 
> { ... something ... }
> 
> this is evaluated pretty much as it is parsed,  returning some music object.
> So
> 
> \keepWithTag #'textI \tag #'textII { #(define l "B") }
> 
> this will first evaluate the expression { #(define l "B") } which returns an
> empty music object and as side effect sets a variable, then it will call
> \tag upon that music, and then call \keepWithTag on that Music.
> 
> What you intend to do is in fact not possible with \tag. What you want to do
> is to delay the evaluation until the point where you have the information
> to make this decision. This can be done using a music function:
> 
> \version "2.24.1"
> 
> #(define l '())
> 
> musicfn =
> #(define-music-function (tag) (symbol?)
>    #{
>      #(if (equal? tag 'textI) (set! l "A"))
>      #(if (equal? tag 'textII) (set! l "B"))
>      c''1^\markup\l
>      #(if (equal? tag 'textI) (set! l "C"))
>      #(if (equal? tag 'textII) (set! l "D"))
>      c''1^\markup\l
>    #})
> 
> \musicfn textI
> \musicfn textII
> 
> Note that here it is necessary to first create the global binding using
> #(define ...) and then use (set! ...) to change that binding.
> 
> Cheers,
> Valentin
> 
> Am Mittwoch, 17. Mai 2023, 21:58:49 CEST schrieb dfro:
> > I want to define and change variables mid-stream in a music expression,
> > while also using tags. Below is an example of what I am trying; but, it
> > does not work.
> > 
> > 
> > \version "2.24.1"
> > 
> > \keepWithTag #'textI
> > %\keepWithTag #'textII
> > 
> > 
> > {
> > 
> >    \tag #'textI { #(define l "A") }
> >    \tag #'textII { #(define l "B") }
> >    c''1 ^\markup \l
> >    \tag #'textI { #(define l "C") }
> >    \tag #'textII { #(define l "D") }
> >    c''1 ^\markup \l
> > 
> > }
> > 
> > 
> > The tags are not keeping lilypond from skipping the define's that are in
> > \tag #'textII. Is there a way to make this work?
> > 
> > Is there a way to define variables using lilypond syntax inside a music
> > expression?
> > 
> > 
> > Peace,
> > 
> > David

Attachment: signature.asc
Description: This is a digitally signed message part.


reply via email to

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