Janek Warchoł <[email protected]> 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 _______________________________________________ lilypond-user mailing list [email protected] https://lists.gnu.org/mailman/listinfo/lilypond-user
