Hi Leah, On Thu, Apr 30, 2015 at 7:28 PM, Leah Velleman <leah.velle...@gmail.com> wrote:
> To do something like you want, you really would need access to context >> properties.... >> > > Ok — good to know I haven't missed some simple solution. > > It seems like there ought to be some way of smuggling information out of > an \applyContext. But I guess there's a variable scope issue that keeps you > from doing it straightforwardly: > > k = "OOPS" > > text = #(define-music-function (parser location music) (ly:music?) > #{ > \applyContext > > #(lambda (context) > (set! k > (ly:context-property context 'tonic)) > (display k) > ) > \transpose #(ly:make-pitch 0 0) #k #music > #} > ) > \score { > > \new Staff { > \key a \major > > \test { Fa So La fa so } > } > > } > > In that code, the (display k) works fine, displaying #<Pitch a>. But then the > \transpose #(ly:make-pitch 0 0) #k #music gets ahold of the global > definition of #k rather than the local one and so you end up with a type > error: expecting pitch, found "OOPS". > > So maybe the question is, does Lilypond Scheme have anything like global > variables? > Sure. But even defining the function with a local variable gives the same results: test = #(define-music-function (parser location music) (ly:music?) (let ((k "ERROR")) #{ \applyContext #(lambda (context) (set! k (ly:context-property context 'tonic)) (display k) ) \transpose #(ly:make-pitch 0 0) #k #music #(display k) #(newline) #} )) \score { \new Staff { \key a \major \test { a b cis d e } } } The problem arises because \applyContext is evaluated later than \transpose. When music functions do their work, contexts have not been created yet, The output shows that the original binding of k is in effect when \transpose is called. Possibly you could just write a music function that firsts sets the key and then transposes everything. Here's a sketch: \version "2.19" test = #(define-music-function (parser location pitch music) (ly:pitch? ly:music?) #{ \key #pitch \major \transpose #(ly:make-pitch 0 0) #pitch #music #}) \score { \new Staff { \test a { c' d' e' f' g' a' b' c'' } } } David
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user