Hi Leah,

On Thu, Apr 30, 2015 at 3:16 PM, Leah Velleman <leah.velle...@gmail.com>
wrote:

> I'm looking to write a \transpose-like music function that will need to be
> able to "find out" what the current key is.
>
> (In case it matters: The reason I'm doing this is to make it possible to
> enter music using movable-do solfege. The idea is to have a function
> \movableDo that will transpose from C (i.e. "do" in a fixed-do system) to
> the tonic of the current key, so that
>
> \key a \major
> \movableDo { do re mi fa so }
>
>
> will produce the same output as
>
> \key a \major
>
> a b cs d e
>
>
> Of course, it would be possible to require the user to repeat the key
> information, by writing this:
>
> \key a \major
>
> \movableDo a { do re mi fa so }
>
> But this is inconveniently redundant, and makes errors more likely in
> large source files, since the key must now be written in many different
> places. So I'm trying to avoid doing it this way if possible.)
>
> In any case, I'm having a very difficult time figuring out how a music
> function can get access to the key. It seems that the issue is that the key
> is a context property; music functions do not take a context as an
> argument, and thus can't get access to context properties the way a
> function written with make-apply-context could. But I can't see how to get
> around that limitation, or indeed whether it would be possible to get
> around it at all.
>

I think the only way you'll be able to get access to the key from a music
function is actually to parse the music expression, looking for the
relevant music events.

Here's something that's pretty limited, but it show that such a thing is
possible.

Note that in this sketch, you have to apply the function to each key area
individually.  It would be nice if you could apply the function to the
whole music expression, but first things first :)

Hope this gets you started--

David

%%%%%%%%%%%%%%%%%%%%%%%%%%

\version "2.18"

\language "italiano" % the closest preset :)

test =
#(define-music-function (parser location music)
   (ly:music?)
   (let ((t (ly:make-pitch 0 0))) ; C is the default tonic
     (music-map
      (lambda (mus)
        (if (music-is-of-type? mus 'key-change-event)
            (set! t (ly:music-property mus 'tonic)))
        (if (music-is-of-type? mus 'note-event)
            #{
              \transpose #(ly:make-pitch 0 0) #t #mus
            #})
        mus)
      music)
     music))


\new Staff {
  \new Voice {
    \test {
      \key re \major
      do'4 mi' sol' do'' <do' mi' sol'>1
    }
    \test {
      \key fa \major
       do'4 mi' sol' do'' <do' mi' sol'>1
    }
    \test {
      \key sol \minor
       do'4 mib' sol' do'' <do' mib' sol'>1
    }
  }
}
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user

Reply via email to