Re: problems trying to write a conditional \transpose

2013-08-19 Thread David Kastrup
Mark Polesky  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


Re: problems trying to write a conditional \transpose

2013-08-19 Thread Mark Polesky
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.

Thanks again.
- Mark

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


Re: problems trying to write a conditional \transpose

2013-08-05 Thread David Kastrup
Mark Polesky  writes:

> 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))

This is assuming that you don't nest processConditionalTransposition, if
you do, you need to write
\processConditionalTransposition #(ly:music-property m 'element) at the
appropriate place.

Untested.

-- 
David Kastrup


___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user


problems trying to write a conditional \transpose

2013-08-05 Thread Mark Polesky
Hi.

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' }



And I've hit another brick wall.  I experimented with some
of the functions in music-functions.scm (map-some-music,
fold-some-music, etc.), but those hard-to-follow function
descriptions slowed me down again.  I've included some vain
attempts below, which are clearly wrong...

Any advice?

Thanks
- Mark



conditionalTranspose = 
#(define-music-function
   (parser location from to music)
   (ly:pitch? ly:pitch? ly:music?)
   (set! music
 (make-sequential-music
   (list (make-music 
   'Music
   'type 'conditional-transposition
   'from from
   'to   to)
 music)))
   music)

#(define conditional-transposition?
   (lambda (music)
 (eq? (ly:music-property music 'type) 'conditional-transposition)))

#(define sequential-music?
   (lambda (music)
 (music-is-of-type? music 'sequential-music)))

processConditionalTransposition =
#(define-music-function
   (parser location music)
   (ly:music?)
   (let ((music-list (extract-typed-music music '(general-music
 (if (list? music-list)
   (for-each (lambda (a b)
   (if (and (conditional-transposition? a)
    (sequential-music? b))
 (ly:music-transpose b ...)))
 music-list 
 (cdr music-list)))
 music))

___
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user