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

Reply via email to