Oops! You'll also need my english-solfa.ly file (attached) to run the
example as is.

Cheers,
Mike


On Wed, Dec 15, 2010 at 5:09 PM, Michael Ellis <michael.f.el...@gmail.com>wrote:

> Thanks, Eluze. The spreadsheet idea is clever!
>
> Since my last post, I've been playing with a python template substitution
> approach that, I think, will meet most of my needs.  Here's a trivial
> example
>
> from mixlyrics import *
>
> ## --------------------------------------
> ## Enter lyrics and notation here. Begin
> ## lyric lines with @@
> soply = """
>     @@ Twink- le, twink- le lit- le star.
>     do4 do sol' sol |
>     la la sol2 |
>
>     @@ How I won- der what you are.
>     fa4 fa mi mi |
>     re re do2 \\bar "|."
>     """
> ## ---------------------------------------
>
> sml = MixLyrics()
> sml.parse(soply)
> soplyrics = sml.emitlyrics()
> sopmelody = sml.emitmelody()
>
> ## Finally, process the Lilypond code
> runlily(template()%locals())
>
>
> where mixlyrics.py is a module containing the MixLyrics class and the
> template() and runlily() functions.
>
> import sys
> from os.path import basename, splitext, join as pjoin
> from subprocess import Popen
>
> class MixLyrics (object):
>     """ Class for interleaving lyrics and notation """
>     def __init__(self, delim="@@"):
>         self.lyrics = []
>         self.melody = []
>         self.delim = delim
>
>     def parse(self,s):
>         for line in s.split('\n'):
>             line=line.strip()
>             if line.startswith(self.delim):
>                 self.lyrics.append(line[len(self.delim):])
>             else:
>                 self.melody.append(line)
>
>     def emitlyrics(self):
>         return " ".join(self.lyrics)
>     def emitmelody(self):
>         return " ".join(self.melody)
>
> def template():
>     return """
>     \include "english-solfa.ly" %% english.ly modified to include solfa
> syllables
>     \score {
>         <<
>         \\new Voice = "Sop" {
>         \\autoBeamOn
>         \\relative do' { %(sopmelody)s }
>         }
>         \\new Lyrics \lyricsto "Sop" { %(soplyrics)s }
>         >>
>     }
>     """
>
> def runlily(lymusic, lilyscript="lily"):
>     """
>     Write and process an .ly file with the same
>     name as this script.
>     Args:
>         'lymusic' is the lilypond code to process
>         'lilyscript' is the name of your script
>             that processes .ly files.
>     """
>     pyname = basename(sys.argv[0])
>     lyname = pjoin(splitext(pyname)[0] + '.ly')
>     print >>file(lyname,'w'), lymusic
>     cmd = "%(lilyscript)s %(lyname)s"%locals()
>     p = Popen(cmd, shell=True)
>     p.wait()
>
>
> To try it out, put the attached .py files into any convenient directory and
> run
>
> python template_example.py
>
> This should create and process a file named "template_example.ly".  Note
> that you need have a lilypond script named 'lily' or else change the call to
> runlily().
>
> I developed this on OS X and it should run as is on Linux.  On Windows you
> may have to muck with the definition of runlily().
>
> For me, this was a lot easier than outsmarting LilyPond's internals since I
> can program in Python at least 10 times faster than in Scheme.  Only
> downsides so far are having to double backslash some lilypond commands and
> the loss of syntax highlighting.  The latter could be fixed by changing the
> extension on input file to something like '.lyp' and telling my editor to
> use lilypond syntax for that extension.
>
> Hope someone finds this useful.
>
> Cheers,
> Mike
>
>
>
> On Wed, Dec 15, 2010 at 3:40 PM, -Eluze <elu...@gmail.com> wrote:
>
>>
>>
>> Michael Ellis wrote:
>> >
>> > Is there a clean way to enter a phrase followed by the corresponding
>> notes
>> > in a \relative block?  The example given in the docs,
>> >
>> > {
>> >   \time 3/4
>> >   \relative c' { c2 e4 g2. }
>> >   \addlyrics { play the game }
>> > }
>> >
>> > is fine for a small example, but it gets messy for longer music.   I
>> > do a lot of transcribing choral parts out of printed scores and would
>> > like to be able to keep the lyrics together with the music in chunks
>> > of a few bars, e.g. something like
>> >
>> > themusic = \relative do {
>> >
>> >    <snip>
>> >
>> >     \withlyrics { Stir- ring be- yond your watch- ful eye. } {
>> >     do2 do4 do |
>> >     do4 re do la |
>> >     \time 3/4 re2. |
>> >     }
>> >
>> >
>> >     \withlyrics { Though they may not flow- er, flow- er, } {
>> >     \time 2/4 sol,4 do |
>> >     \time 2/2 fa,2 mi2 |
>> >     re4( mi) fa( la) |
>> >     \time 3/4 te2 la4 |
>> >
>> >    }
>> >
>> > <snip>
>> >
>> > }
>> >
>> > I'm finding that I make fewer errors and can fix the ones I do make
>> > faster if the lyrics are close to the notation.  As it is now, I have
>> > to re-enter (cut, paste & edit)  the lyrics in a separate \lyricmode
>> > block.  Any suggestions for how to write the \withLyrics function?  Or
>> > is there an existing clean solution I haven't found yet?
>> >
>> > Thanks,
>> > Mike
>> >
>> >
>>
>> imo it is a question of synchronising & visualising the input of 2 ore
>> more
>> "voices" (in a general way)
>>
>> one way is to put both in a table, the first row being the melody, the
>> second row the lyrics. then you can c&p each to the corresponding ly-file.
>>
>> if you are not happy with spreadsheet tools you can do the same with an
>> editor allowing to edit two synchronized files (in vertical scrolling);
>> that
>> way you could have the melody in the left and the lyric text in the right
>> window (which are both included somewhere in your main score).
>>
>> (of course you can also use one line per measure)
>>
>> hope these ideas are helpful!
>>
>> Eluze
>>
>>
>> --
>> View this message in context:
>> http://old.nabble.com/Mixing-notation-and-lyric-entry-tp30458087p30467715.html
>> Sent from the Gnu - Lilypond - User mailing list archive at Nabble.com.
>>
>>
>> _______________________________________________
>> lilypond-user mailing list
>> lilypond-user@gnu.org
>> http://lists.gnu.org/mailman/listinfo/lilypond-user
>>
>
>

Attachment: english-solfa.ly
Description: Binary data

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

Reply via email to