lilypond-user
[Top][All Lists]
Advanced

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

Re: relative music inside music functions explodes when used twice


From: David Kastrup
Subject: Re: relative music inside music functions explodes when used twice
Date: Sat, 11 Oct 2014 21:01:29 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux)

Janek Warchoł <address@hidden> writes:

> Hi,
>
> i have a function that takes music as an argument and uses it twice - each
> time with a different tag appended, so that later on i can decide what to
> output:
>
> voiceDivisi =
> #(define-music-function (parser location m1 m2) (ly:music? ly:music?)
>    #{
>      \tag divI \context Voice = "divI" { #m1 }
>      \tag divII \context Voice = "divII" { #m2 }
>      \tag together \context Voice = "both" << #m1 #m2 >>
>    #})
>
> The problem is that when used with relative mode, the output gets crazy:
>
> music = \relative c' {
>   \voiceDivisi {
>     c4 d e f
>   }
>   {
>     e4 f g a
>   }
> }
>
> \new Staff \keepWithTag divI \music
> \new Staff \keepWithTag divII \music
> \new Staff \keepWithTag together \music
>
> (see attachment)
>
> I have checked that the problem disappears when the function uses the
> arguments (m1 and m2) only once.  Is this a bug?

No.

<URL:http://www.lilypond.org/doc/v2.19/Documentation/extending/adding-articulation-to-notes-_0028example_0029>

    In an earlier example, we constructed music by repeating a given
    music argument. In that case, at least one repetition had to be a
    copy of its own. If it weren’t, strange things may happen. For
    example, if you use \relative or \transpose on the resulting music
    containing the same elements multiple times, those will be subjected
    to relativation or transposition multiple times. If you assign them
    to a music variable, the curse is broken since referencing ‘\name’
    will again create a copy which does not retain the identity of the
    repeated elements.

> Can i work around it, or maybe i should be doing this in an altogether
> different way?

Use ly:music-deep-copy on one of the copies.  Better both.  Or write $x
instead of #x in order to get such a copy.

-- 
David Kastrup




reply via email to

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