Mark Polesky <markpole...@yahoo.com> writes: > David Kastrup wrote: >>> I'm trying to write a conditional version of the \transpose >>> function, that would work something like this... >>> >>> input = { >>> c c >>> \conditionalTransposition c c' { c c } >>> } >>> >>> \input >>> => { c c c c } >>> >>> \processConditionalTransposition \input >>> => { c c c' c' } >> >> conditionalTransposition = >> #(define-music-function (parser location from to music) >> (ly:pitch? ly:pitch? ly:music?) >> (set! music #{ \transpose c' c' #music #}) >> (set! (ly:music-property 'from-to music) (cons from to)) >> music) >> >> processConditionalTransposition = >> #(define-music-function (parser location music) (ly:music?) >> (map-some-music >> (lambda (m) >> (and (music-is-of-type? m 'transposed-music) >> (pair? (ly:music-property m 'from-to music)) >> #{ \transpose #(car (ly:music-property m 'from-to-music)) >> #(cdr (ly:music-property m 'from-to-music)) >> #(ly:music-property m 'element) >> #})) >> music)) > > David, > > sorry for the delayed response. Your solution is excellent! > I'm learning so much from you.
The code is written in a manner that does not make it obvious, but I should have mentioned why I stored a pitch pair rather than a single pitch difference: this was in order not to have an outer \transpose affect the pitch difference information: music properties containing a single pitch are converted by \transpose. A pitch pair is left alone. -- David Kastrup _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user