On Thu, Sep 15, 2011 at 3:16 PM, David Kastrup <d...@gnu.org> wrote:

> Michael Ellis <michael.f.el...@gmail.com> writes:
>
> > I've written some music functions I use frequently to operate on
> > lyrics.  For example, there's one call "lacc" that allows me to
> > intermix lyrics and notation by accumulating the lyrics into a list I
> > can instantiate later in the \score block.   Very nice and convenient,
> > but the usage is a little messy:
> >
> >
> > \lacc \lyricmode { This is a ly -- ric line. }
> > c4 d e f | g a
> >
> > \lacc \lyricmode { Here is the next. }
> > b c  | d c2. |
> >
> > Normally, I deal with the messiness by defining a keystroke macro in
> > my editor that wraps a line of bare text in the necessary commands and
> > braces.  I now find myself   (skipping a long story)  needing to work
> > in an environment where keystroke macros will not be available.
> >
> > Is it possible to define a music function that will do the work of my
> > keystroke macro?  Ideally I'd like to be able to  write in an input
> > file something like
> >
> > \lyr This is a lyric line
> >
> > and have LilyPond do the rest,  but none of my attempts thus far have
> > worked.
>
> The arguments of a music function are parsed before it is called, so
> no.  However, if you already are in lyrics mode, you can pick up the
> music in that manner.  You may also think about doing
>
> \lacc " This is a lyric line "
>
> and then using ly:parser-parse-string to pick up lyricmode expressions.
> It might be nice at one point of time to be able to call #{ \lyricmode
> \somefunction-taking-a-music-argument #} or similar trickery, but this
> kind of closure is not available yet.
>
> Thanks, David.  I figured it must be a parsing issue so it's nice to have
it clarified by someone knowledgable.   I like the ly:parser-parse-string
idea.  Does that function return a music object if the parsing is
successful?

Would it work to have my \lacc function massage the string so that it
becomes

"\lyricmode { This is a lyric line }"

and then call ly:parser-parse-string to return the result?

For reference (and in case someone else might find it useful) here is the
complete set of functions I currently have:

%% --------------------------------------------
#(define (make-music-accumulator)
  (define acc '())

  (define (add lyr)
    (set! acc (append acc lyr)))

  (define (get) acc)

  (define (interface op . rest)
    (cond
      ((eq? op 'add)
        (add (car rest)))
      ((eq? op 'get)
        (get))
      (else (error "Undefined operation"))))

  interface)

#(define defaultLyricAccumulator (make-music-accumulator))

lacc =
#(define-music-function (parser location music) (ly:music?)
  "For accumulating lyrics mixed with notation"
  (defaultLyricAccumulator
    'add
    (ly:music-property music 'elements))
  (make-music 'SequentialMusic 'void #t))



getLyrics =
#(define-music-function (parser location) ()
 "for retrieving accumulated lyrics."
  (make-music
    'SequentialMusic
    'elements
    (defaultLyricAccumulator 'get)))

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

Reply via email to