Armide : relecture livret acte 2 & 3 / Ballard
[nenuvar.git] / scripts / livret.py
blobce84cfff0dd255e56c55833639d8c44001ed4219
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(
9 self.get_metric(),
10 self.get_text())
12 class EludedVerse(LilyVerse):
13 def __init__(self, text, forced_metric):
14 LilyVerse.__init__(self, text)
15 self._forced_metric = forced_metric
17 def get_metric(self):
18 return self._forced_metric
20 class VersePart(LilyVerse):
21 def __init__(self, text):
22 LilyVerse.__init__(self, text)
23 self._prev_part = []
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
35 def get_metric(self):
36 return self._last_part.get_metric()
38 def get_text(self):
39 if self._prev_parts == []:
40 return Verse.get_text(self)
41 else:
42 return "\\transparent {{ {} }} {}".format(
43 " ".join([Verse.get_text(part) for part in self._prev_parts]),
44 Verse.get_text(self))
47 class VerseLastPart(VersePart):
48 def __init__(self, text):
49 VersePart.__init__(self, text)
51 def get_metric(self):
52 metric = Verse.get_metric(self)
53 for part in self.get_previous_parts():
54 metric += Verse.get_metric(part)
55 return metric
57 class LilyLine():
58 def __init__(self, text):
59 self._text = text
61 def syllabify(self, sign_tokenizer = None, syllable_tokenizer = None ):
62 pass
64 def get_lily_text(self):
65 return self._text
67 class Lilybretto():
68 def __init__(self):
69 self._lines = []
71 def add_line(self, line):
72 self._lines.append(line)
74 def get_lines(self):
75 return self._lines
77 def syllabify(self,
78 sign_tokenizer = SignTokenizer(),
79 syllable_tokenizer = SyllableTokenizerWithWordSeparation()):
80 for line in self._lines:
81 line.syllabify(sign_tokenizer, syllable_tokenizer)
84 class RawLibrettoReader():
85 def read(self, filename):
86 file = open(filename, 'r')
87 libretto = Lilybretto()
88 verse_parts = []
89 for line in file:
90 verse_match = re.match(r"^%#(\S*) (.*)$", line)
91 if verse_match:
92 # a verse
93 cmd = verse_match.group(1)
94 verse = verse_match.group(2).strip()
95 if cmd == "":
96 # a regular full verse
97 libretto.add_line(LilyVerse(verse))
98 elif cmd == "-":
99 # a split verse
100 verse_part = VersePart(verse)
101 verse_part.set_previous_parts(list(verse_parts))
102 verse_parts.append(verse_part)
103 libretto.add_line(verse_part)
104 elif cmd == "=":
105 last_part = VerseLastPart(verse)
106 last_part.set_previous_parts(verse_parts)
107 libretto.add_line(last_part)
108 for part in verse_parts:
109 part.set_last_part(last_part)
110 verse_parts = []
111 else:
112 # cmd is expected to be a number
113 # TODO: robustness/error handling
114 # an eluded verse
115 libretto.add_line(EludedVerse(verse, int(cmd)))
116 else:
117 # a LilyPond line
118 libretto.add_line(LilyLine(line.rstrip()))
119 return libretto
121 if __name__ == '__main__':
122 for filename in sys.argv[1:]:
123 reader = RawLibrettoReader()
124 libretto = reader.read(filename)
125 libretto.syllabify()
126 for line in libretto.get_lines():
127 print(line.get_lily_text())