paolo prete <paoloprete...@gmail.com> writes: > in the snippet below I want to replace, while iterating two lists, the > elements of music1 with the elements of music2. > The code shows how to do that for pitches, but how can I replace the whole > element? (for example, a rest or a note with its articulation) > %%%%%%%% > > fun = #(define-music-function (parser location music1 music2) (ly:music? > ly:music?) > (let > ( > (musicList1 (ly:music-property music1 'elements)) > (musicList2 (ly:music-property music2 'elements)) > ) > (map > (lambda (x y) > ;iterate notes > (display "note found\n") > ;(set! (ly:music-property x 'pitch) #{c'#}) > ;(ly:music-set-property! x 'pitch #{c' #}) > (ly:music-set-property! x 'pitch (ly:music-property y 'pitch)) > ) > musicList1 musicList2 > ) > ) > #{ $music1 #}) > > { > \fun {c' d' e'} {f' g' a'} > }
Something like
fun = #(define-music-function (parser location music1 music2) (ly:music? ly:music?) (let* ((pred? (music-type-predicate '(event-chord rhythmic-event))) (musicList2 (apply circular-list (extract-music music2 pred?)))) (define (get-music) (let ((elt (music-clone (car musicList2)))) (set! musicList2 (cdr musicList2)) elt)) (map-some-music (lambda (m) (and (pred? m) (get-music))) music1))) { \fun {c' d' e'} {f' <g' a'>} }
I'm fuzzy on what music1 is actually good for at all since only a scant sketch of its structure is used at all. Probably you need to vary/copy more from the original. The music-clone function can take additional arguments: maybe that allows you to do something more useful. -- David Kastrup
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user