1 from syllabify
import *
3 class LilyVerse(Verse
):
4 def __init__(self
, text
):
5 Verse
.__init
__(self
, text
)
7 def get_lily_text(self
):
8 return "\livretVerse#{} {{ {} }}".format(
12 class EludedVerse(LilyVerse
):
13 def __init__(self
, text
, forced_metric
):
14 LilyVerse
.__init
__(self
, text
)
15 self
._forced
_metric
= forced_metric
18 return self
._forced
_metric
20 class VersePart(LilyVerse
):
21 def __init__(self
, text
):
22 LilyVerse
.__init
__(self
, text
)
24 self
._last
_part
= None
26 def set_last_part(self
, last_part
):
27 self
._last
_part
= last_part
29 def set_previous_parts(self
, parts
):
30 self
._prev
_parts
= parts
32 def get_previous_parts(self
):
33 return self
._prev
_parts
36 return self
._last
_part
.get_metric()
39 if self
._prev
_parts
== []:
40 return Verse
.get_text(self
)
42 return "\\transparent {{ {} }} {}".format(
43 " ".join([Verse
.get_text(part
) for part
in self
._prev
_parts
]),
47 class VerseLastPart(VersePart
):
48 def __init__(self
, text
):
49 VersePart
.__init
__(self
, text
)
52 metric
= Verse
.get_metric(self
)
53 for part
in self
.get_previous_parts():
54 metric
+= Verse
.get_metric(part
)
58 def __init__(self
, text
):
61 def syllabify(self
, sign_tokenizer
= None, syllable_tokenizer
= None ):
64 def get_lily_text(self
):
68 def __init__(self
, language
):
70 self
.language
= language
72 def add_line(self
, line
):
73 self
._lines
.append(line
)
79 sign_tokenizer
= SignTokenizer(language
= self
.language
)
80 syllable_tokenizer
= SyllableTokenizerWithWordSeparation()
81 for line
in self
._lines
:
82 line
.syllabify(sign_tokenizer
, syllable_tokenizer
)
85 class RawLibrettoReader():
86 def __init__(self
, language
="fr"):
87 self
.language
= language
90 #file = open(filename, 'r')
91 libretto
= Lilybretto(self
.language
)
94 verse_match
= re
.match(r
"^%#(\S*) (.*)$", line
)
97 cmd
= verse_match
.group(1)
98 verse
= verse_match
.group(2).strip()
100 # a regular full verse
101 libretto
.add_line(LilyVerse(verse
))
104 verse_part
= VersePart(verse
)
105 verse_part
.set_previous_parts(list(verse_parts
))
106 verse_parts
.append(verse_part
)
107 libretto
.add_line(verse_part
)
109 last_part
= VerseLastPart(verse
)
110 last_part
.set_previous_parts(verse_parts
)
111 libretto
.add_line(last_part
)
112 for part
in verse_parts
:
113 part
.set_last_part(last_part
)
116 # cmd is expected to be a number
117 # TODO: robustness/error handling
119 libretto
.add_line(EludedVerse(verse
, int(cmd
)))
122 libretto
.add_line(LilyLine(line
.rstrip()))
125 if __name__
== '__main__':
126 parser
= argparse
.ArgumentParser(
127 description
='LilPond libretto generation.',
128 formatter_class
=argparse
.ArgumentDefaultsHelpFormatter
)
132 help='verse language (fr, it)')
134 'files', metavar
='FILE',
135 type=argparse
.FileType('r'),
138 args
= vars(parser
.parse_args())
139 for file in args
['files']:
140 reader
= RawLibrettoReader(args
['language'])
141 libretto
= reader
.read(file)
143 for line
in libretto
.get_lines():
144 print(line
.get_lily_text())