initial commit

This commit is contained in:
Sebastian Hugentobler 2016-12-29 15:27:39 +01:00
commit f408b8004a
No known key found for this signature in database
GPG Key ID: 7BBE74D3F626FC0F
21 changed files with 1418 additions and 0 deletions

12
.editorconfig Normal file
View File

@ -0,0 +1,12 @@
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4
[Makefile]
indent_style = tab

10
.gitignore vendored Executable file
View File

@ -0,0 +1,10 @@
*~
.DS_Store
*.swp
*.lock*
*.waf*
out
pdf
midi
music
build

184
lib/lyluatex.lua Normal file
View File

@ -0,0 +1,184 @@
local err, warn, info, log = luatexbase.provides_module({
name = "lyluatex",
version = '0',
greinternalversion = internalversion,
date = "2016/09/08",
description = "Module lyluatex.",
author = "The Gregorio Project (see CONTRIBUTORS.md)",
copyright = "2008-2016 - The Gregorio Project",
license = "MIT",
})
local md5 = require 'md5'
LILYPOND = 'lilypond'
TMP = (os.getenv('TMP_LY') and os.getenv('TMP_LY') or 'tmp_ly')
N = 0
function ly_definir_programme(lilypond)
if lilypond then LILYPOND = lilypond end
end
function contenuIntegral(contenu)
local content =""
for i, Line in ipairs(contenu:explode('\n')) do
if Line:find("^%s*[^%%]*\\include") then
local i = io.open(Line:gsub('%s*\\include%s*"(.*)"%s*$', "%1"), 'r')
if i then
content = content .. contenuIntegral(i:read('*a'))
else
content = content .. Line .. "\n"
end
else
content = content .. Line .. "\n"
end
end
return content
end
function direct_ly(ly, largeur, facteur)
N = N + 1
facteur = calcul_facteur(facteur)
ly = ly:gsub('\\par ', '\n')
local sortie = TMP..'/'..string.gsub(md5.sumhexa(contenuIntegral(ly))..'-'..facteur..'-'..largeur, '%.', '-')
if not lfs.isfile(sortie..'-systems.tex') then
compiler_ly(entete_lilypond(facteur, largeur - 10)..'\n'..ly, sortie)
end
retour_tex(sortie)
end
function inclure_ly(entree, currfiledir, largeur, facteur)
facteur = calcul_facteur(facteur)
nom = splitext(entree, 'ly')
entree = currfiledir..nom..'.ly'
if not lfs.isfile(entree) then entree = kpse.find_file(nom..'.ly') end
if not lfs.isfile(entree) then err("Le fichier %s.ly n'existe pas.", nom) end
local i = io.open(entree, 'r')
ly = i:read('*a')
i:close()
local sortie = TMP..'/' ..string.gsub(md5.sumhexa(contenuIntegral(ly))..'-'..facteur..'-'..largeur, '%.', '-')
if not lfs.isfile(sortie..'-systems.tex') then
compiler_ly(entete_lilypond(facteur, largeur - 10)..'\n'..ly, sortie, dirname(entree))
end
retour_tex(sortie)
end
function compiler_ly(ly, sortie, include)
mkdirs(dirname(sortie))
local commande = LILYPOND.." "..
"-dno-point-and-click "..
"-dbackend=eps "..
"-djob-count=2 "..
"-ddelete-intermediate-files "
if include then commande = commande.."-I "..lfs.currentdir()..'/'..include.." " end
commande = commande.."-o "..sortie.." -"
local p = io.popen(commande, 'w')
p:write(ly)
p:close()
end
function entete_lilypond(facteur, largeur)
return string.format(
[[%%En-tête
\version "2.18.2"
#(define default-toplevel-book-handler
print-book-with-defaults-as-systems )
#(define toplevel-book-handler
(lambda ( . rest)
(set! output-empty-score-list #f)
(apply print-book-with-defaults rest)))
#(define toplevel-music-handler
(lambda ( . rest)
(apply collect-music-for-book rest)))
#(define toplevel-score-handler
(lambda ( . rest)
(apply collect-scores-for-book rest)))
#(define toplevel-text-handler
(lambda ( . rest)
(apply collect-scores-for-book rest)))
#(set-global-staff-size %s)
%%Paramètres de la partition
\paper{
indent = 0\mm
line-width = %s\pt
}
%%Partition originale
]],
facteur,
largeur
)
end
function calcul_facteur(facteur)
if facteur == 0 then facteur = fontinfo(font.current()).size/39321.6 end
return facteur
end
function retour_tex(sortie)
local i = io.open(sortie..'-systems.tex', 'r')
contenu = i:read("*all")
i:close()
texoutput, _ = string.gsub(
contenu,
[[includegraphics{]], [[includegraphics{]]..dirname(sortie)
)
tex.print(([[\noindent]]..texoutput):explode('\n'))
end
function dirname(str)
if str:match(".-/.-") then
local name = string.gsub(str, "(.*/)(.*)", "%1")
return name
else
return ''
end
end
function splitext(str, ext)
if str:match(".-%..-") then
local name = string.gsub(str, "(.*)(%." .. ext .. ")", "%1")
return name
else
return str
end
end
function mkdirs(str)
path = '.'
for dir in string.gmatch(str, '([^%/]+)') do
path = path .. '/' .. dir
lfs.mkdir(path)
end
end
local fontdata = fonts.hashes.identifiers
function fontinfo(id)
local f = fontdata[id]
if f then
return f
end
return font.fonts[id]
end
mkdirs(TMP)

71
lib/lyluatex.sty Normal file
View File

@ -0,0 +1,71 @@
\ProvidesPackage{lyluatex}
% Dépendances
\RequirePackage{luatexbase}
\RequirePackage{luaotfload}
\RequirePackage{kvoptions}
\RequirePackage{graphicx}
\RequirePackage{keycommand}
\RequirePackage{environ}
\RequirePackage{currfile}
% Options
\DeclareStringOption[lilypond]{program}[lilypond]
\ProcessKeyvalOptions*
% Script lua
\directlua{dofile(kpse.find_file("lyluatex.lua"))}
\directlua{LILYPOND = '\lyluatex@program'}
% Une tricherie un peu sale pour récupérer la largeur de ligne
\let\bs\textbackslash
{\catcode`p=12 \catcode`t=12 \gdef\un#1pt{#1}}
\newcommand*{\largeur}{\expandafter\un\the\linewidth}
% Taille des partitions
% Si la valeur est 0, elle sera automatiquement calculée
% à partir de la taille de police.
\def\staffsize{0}
\let\localstaffsize\staffsize
% Commandes principales
% Inclusion d'un fichier ly
\newkeycommand*\includely[staffsize=\staffsize][autres][1]{%
\directlua{%
inclure_ly(
"\luatexluaescapestring{#1}",
"\luatexluaescapestring{\currfiledir}",
\luatexluaescapestring{\largeur},
\luatexluaescapestring{\commandkey{staffsize}}
)%
}%
}
% Inclusion d'un fragment intégré au document (environnement de base)
\NewEnviron{compilerly}{%
\directlua{%
direct_ly(
"\luatexluaescapestring{\unexpanded\expandafter{\BODY}}",
\luatexluaescapestring{\largeur},
\luatexluaescapestring{\localstaffsize}
)%
}%
}
% Commande et environnement avec paramètres
\newkeycommand{\lily}[staffsize=\staffsize][autres][1]{%
\def\localstaffsize{\commandkey{staffsize}}%
\begin{compilerly}%
#1
\end{compilerly}%
}
\newkeyenvironment{ly}[staffsize=\staffsize][autres]{%
\def\localstaffsize{\commandkey{staffsize}}%
\compilerly%
}{
\endcompilerly%
}
% Commandes pour la compatibilité avec lilypond-book
\let\lilypondfile\includely
\let\lilypond\ly
\let\endlilypond\endly

View File

@ -0,0 +1,29 @@
\par
2. Beim Rosenwirt im Stübel drin, da sitzt ein junges Blut,
die schmucke, schlanke Kellnerin war ihm noch gestern gut.
Doch heute ist sie durchgebrannt fahr wohl du falsche Hex!
Der Bursch kehrt sein Gesicht zur Wand und summt um halber sechs:
|: "Bierlein rinn! Bierlein rinn! Bierlein rinn! Bierlein rinn! Was nutzen mir die Kreuzerlein, wenn ich gestorben bin!" :|
\par
3. Beim Rosenwirt am Eichentisch, da thront ein braver Greis,
die Wangen rot, die Augen frisch, die Haare silberweiss!
Schlug ihm gleich manchen grossen Plan das Schicksal schnöd entzwei ---
um halber sechs schlächt auch wer an, der alte brummt dabei:
"Bierlein rinn! ..."
\par
4.
Beim Rosenwirt am Grabentor, da blüht ein fein Gewächs,
das heben wir im Glas empor schon abends um halb sechs.
Wir heben es gar emsig hoch, wir leeren's auf den Grund ---
um Mitternacht da klingt es noch, schallt's noch von Mund zu Mund:
"Bierlein rinn! ..."
\par
5. Und schlägt mir einst der Sensenmann den Nagel auf die Truh,
rast ich von harter Lebensbahn in kühler Grabesruh,
dann schwingt bekränzt den Becher mir, dem müden Wandersmann,
der euch gelehrt den Spruch zum Bier, und hebet also an:
"Bierlein rinn! ..."
\\~
\begin{flushright}
Julius Rudolf Gspandl
\end{flushright}

View File

@ -0,0 +1,22 @@
\par
2. Mich ruft mein Geschick von den Freunden hinweg:
ihr Redlichen ergo bibamus!
Ich scheide von hinnen mit leichtem Gepäck,
drum doppeltes: ergo bibamus!
Und was auch der Filz von dem Leibe sich schmort,
so bleibt für den Heitern doch immer gesorgt,
weil immer dem Frohen der Fröhliche sorgt;
|: drum, Brüderchen: ergo bibamus! :|
\par
3. Was sollen wir sagen zum heutigen Tag?
Ich dächte nur: ergo bibamus!
Er ist nun einmal von besonderem Schlag,
drum immer aufs neue: bibamus!
Er führet die Freude durchs offene Tor,
es glänzen die Wolken, es teilt sich der Flor,
da scheint uns ein Bildchen, ein göttliches, vor,
|: wir klingen und singen: bibamus! :|
\\~
\begin{flushright}
Goethe, 1810
\end{flushright}

View File

@ -0,0 +1,38 @@
\par
2. Ubi sunt, qui ante nod in munod luere?
Vadite ad superos, transite ad inferos,
|: ubi iam luere. :|
\par
3. Vita nostra brevis est,
brevi finietur,
venit mors velociter,
rapit nos atrociter,
nemini parcetur.
\par
4. Vivat academia,
vivant professores,
vivat membrum quodlibet,
vivant membra quaelibet,
semper sint in flore!
\par
5. Vivat omnes virgines
faciles, formosae,
vivant et mulieres,
tenerae, amabiles,
bonae, laboriosae!
\par
6. Vivat et res publica
et qui illam regit,
vivat nostra civitas,
maecenatum caritas,
quae nos hic protegit!
\par
7. Pereat tristitia,
pereant osores,
pereat diabolus,
quivis antiburschius,
atque irrisores!
\\~
\begin{flushright}
Neuere Fassung von Kindleben, 1781
\end{flushright}

View File

@ -0,0 +1,10 @@
\par
2. Da trink ich schnell und warte nicht und küsse dich im Wein,
|: aufs neu zu schaun dein Angesicht, :|: schenk schnell ich wieder ein! :|
\par
3. So füll und leer mein Gläschen ich und trinke immerzu.
|: Nennt man mich nächstens liederlich, :|: die Schuld mein Schatz hast du! :|
\\~
\begin{flushright}
Rudolf Hermanns
\end{flushright}

View File

@ -0,0 +1,25 @@
\par
2. "Angekreidet wird hier nicht, weils an Kreide uns gebricht,"
lacht die Wirtin heiter.
"Hast du keinen Heller mehr, gib zum Pfand dein Ränzel her, |: aber trinke weiter! :|"
\par
3. Tauscht der Bursch sein Ränzel ein,
gegen einen Krug voll Wein,
tät zum Gehn sich wenden.
Spricht die Wirtin: "Junges Blut, hast ja Mantel, Stab und Hut: |: trink und lass dich pfänden! :|"
\par
4. Da vertrank der Wanderknab Mantel, Hut und Wanderstab, sprach betrübt:
"Ich scheide. Fahre wohl du kühler Trank, Lindenwirtin jung und schlank, |: liebliche Augenweide! :|"
\par
5. Spricht zu ihm das schöne Weib: "Hast ja noch ein Herz im Leib, lass mir's trauter Wandrer!"
Was geschah ich tu's euch kund: auf der Wirtin rotem Mund |: brannte heiss ein andrer. :|
\par
6. Der dies neue Lied erdacht,
sang's in einer Sommernacht lustig in die Winde,
vor ihm stund ein volles Glas,
neben ihm Frau Wirtin sass
|: unter der blühenden Linde :|
\\~
\begin{flushright}
Rudolf Baumbach, 1876
\end{flushright}

View File

@ -0,0 +1,16 @@
\par
2. Noch klingen Lied und Becher,
doch sitzen andre Zecher,
|: wir selbst in diesem Raum, :|
und lassen's uns behagen nach gut und bösen Tagen,
|: doch alles ist ein Traum. :|
\par
3. Nicht lang, so füllen wieder bei Becherklang und Lieder,
ganz andre diesen Raum,
und treiben was wir trieben,
und singen, trinken, lieben,
bis alles wird ein Traum.
\\~
\begin{flushright}
Johann Nepomuk Vogl, vor 1852
\end{flushright}

View File

@ -0,0 +1,92 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "Bierlein, rinn!"
composer = "Otto Lob, 1896"
poet = "Gemütlich"
tagline = ""
}
musicOne = \relative d' {
\time 4/4
\key g \major
\partial 8 d8 |
g8. fis16 g8 d fis fis fis b, |
e8. dis16 e8 c d4 r8 d |
d c' c d, d b' b g |
fis a g e d4 r8 d\p |
d8. e16 fis8 g a gis a fis |
fis8.^"zögernd" g16 a8\< b\! c4\fermata r8 d,^"im Zeitmass" |
b'8. ais16 b8 d a gis a c |
b g a fis g4 d'8.\fermata c16 |
\repeat volta 2
{
b4 d,8. d16 d4 c'8.-> b16 |
a4 d,8. d16 d4 r8 d\p |
g8. a16 b8 c d8. e16 d8 c |
b^"zögernd" g a fis g4 r8 s |
}
\alternative
{
{ d'8.\fermata c16 | }
{ r2 r4 | }
}
}
verseOne = \lyricmode {
Beim Ro -- sen -- wirt am Gra -- ben -- tor des |
Ab -- ends um halb sechs den |
Ham -- mer schwingt der Wirt em -- por und |
schlägt den Zap -- fen ex! Das |
schlurrt und glurrt aus feuch -- ter Nacht vom |
Spund -- loch in die Kann'; ei |
seht, wie's Ant -- litz je -- dem lacht, jed -- |
we -- dem Ze -- chers -- mann: Bier -- lein, |
rinn! Bier -- lein rinn! Bier -- lein |
rinn! Bier -- lein rinn! Was |
nut -- zen mir die Keu -- zer -- lein, wenn |
ich ge -- stor -- ben bin! |
Bier -- lein |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
>>
\layout {
}
}
}
\book {
\bookOutputName "bierlein_rinn_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 110
}
}
}

100
src/scores/ergo_bibamus.ly Normal file
View File

@ -0,0 +1,100 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "Ergo Bibamus!"
composer = "Max Eberwein, 1813"
tagline = ""
}
musicOne = \relative f' {
\time 4/4
\key g \minor
\partial 8 f8\f
\repeat volta 2 {
f4 d8 es f4 g8 a |
bes4 a8 g f4 r8 f |
a4 g8 a bes4 a8 g |
f4 (e) f r8 f |
}
c'4 c8 bes a4 (a8) g |
f4 f8 es d4 r8 f |
c'4 c8 bes a4 a8 g |
f4 f8 es d4 r8 f |
f4 g8 a bes4 a8 bes |
c4 bes8 c d4 r8 d |
d4 c8 d es4 d8 c |
bes4 (c) d r8 d \ff |
d4 c8 d f (es) d c |
bes2 (a) |
bes\fermata r4 r8 \bar "|."
}
verseOne = \lyricmode {
Hier sind wir ver -- sam -- melt zu |
löb -- li -- chem Run, drum, |
Brü -- der -- chen, er -- go bi -- |
ba -- mus! (Das) |
heisst noch ein altes, ein |
tüch -- ti -- ges Wort, es |
pas -- set zum er -- sten und |
pas -- set so -- fort und |
schal -- let, ein E -- cho, vom |
fest -- li -- chen Ort, ein |
herr -- li -- ches: er -- go bi -- |
ba -- mus! ein |
herr -- li -- ches: er -- go bi -- |
ba -- |
mus! |
}
verseOneRepeat = \lyricmode {
Die Glä -- ser sie klin -- gen, Ge -- |
sprä -- che sie ruhn; be -- |
her -- zi -- get: er -- go bi -- |
ba -- mus! _ |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
\new Lyrics \lyricsto "one" {
\verseOneRepeat
}
>>
\layout {
}
}
}
\book {
\bookOutputName "ergo_bibamus_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 120
}
}
}

View File

@ -0,0 +1,82 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "Gaudeamus Igitur"
poet = "Frisch"
tagline = ""
}
musicOne = \relative b' {
\time 3/4
\key g \minor
\repeat volta 2 {
bes8. \f f16 f4 bes |
g8. g16 g2 |
a8. bes16 c4 a |
bes8 (d) bes4 r |
a8. bes16 c4 c |
d8 bes c4 c |
a8. bes16 c4 c |
d8 bes c4 c |
bes8. a16 g8 (es') d (c) |
d4 (c) bes\fermata |
bes8. a16 g8 (es') d (c) |
f4 (a,) bes\fermata |
}
}
verseOne = \lyricmode {
Gau -- de -- a -- mus |
i -- gi -- tur, |
iu -- ve -- nes dum |
su -- mus; |
post iu -- cum -- dam |
iu -- ven -- tu -- tem, |
post mo -- le -- stam |
se -- nec -- tu -- tem |
nos ha -- be -- bit |
hu -- mus, |
nos ha -- be -- bit |
hu -- mus! |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
>>
\layout {
}
}
}
\book {
\bookOutputName "gaudeamus_igitur_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 100
}
}
}

View File

@ -0,0 +1,82 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "In jedem vollen Glase Wein"
composer = "Otto Lob, 1896"
poet = "Mit Ausdruck"
tagline = ""
}
musicOne = \relative d' {
\time 6/8
\key g \major
\partial 8 d8 |
b (d) g b4-^ a8 |
g4 e8 d4 d8^"zart" |
a'4 gis8 a4 c,8 |
e4. (d8) r d |
g4 g8 g (fis) e8 |
fis4 b,8 b4 b8 |
b'4 b8 b (a) g |
a4 d,8 d4 d8 |
b8 (d) g b-^ (c-^) d-^ |
d4.\> (e,8\fermata\!) r c'^"langsamer" |
b8 (d,) b' a\< (d\fermata) fis,\!\> |
g4. (g8\!) r \bar "|."
}
verseOne = \lyricmode {
In je -- dem vol -- len |
Gla -- se Wein seh |
un -- ten auf dem |
Grund ich |
dei -- ne hel -- len |
Äu -- ge -- lein, ich |
dei -- ne hel -- len |
Äu -- ge -- lein und |
dei -- nen sü -- ssen |
Mund, und |
dei -- nen sü -- ssen |
Mund. |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
>>
\layout {
}
}
}
\book {
\bookOutputName "in_jedem_vollen_glase_wein_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 100
}
}
}

View File

@ -0,0 +1,88 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "Die Lindenwirtin"
composer = "Franz Abt, 1878"
poet = "In gemütlicher Bewegung"
tagline = ""
}
musicOne = \relative a' {
\time 6/8
\key d \major
a4\mf a8 a8. (g16) fis8 |
b4 b8 b4. |
b4 b8 d8. (g,16) b8 |
b4 a8 a4. |
a4\< e8 e (a) cis\! |
b4.\> a4\! r8 |
g4\p g8 g8. (fis16) e8 |
fis4\< a8 d4.\! |
g,4\p\< g8 g8. (fis16) e8\! |
fis4 a8 d4. |
d4\f cis8 e8. (d16) b 8 |
b4. a4 r8 |
a4\p a8 b8. (a16) fis8 |
a4. (cis) |
d4 r8 r4 r8 \bar "|."
}
verseOne = \lyricmode {
Kei -- nen Tropfen im |
Be -- cher mehr |
und der Beu -- tel |
schlaff und leer, |
lech -- zend Herz und |
Zun -- ge. |
An -- ge -- tan hat |
mir's dein Wein, |
dei -- ner Äug -- lein |
hel -- ler Schein, |
Lin -- den -- wirtin, du |
jun -- ge |
Lin -- den -- wirtin, du |
jun -- |
ge! |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
>>
\layout {
}
}
}
\book {
\bookOutputName "lindenwirtin_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 100
}
}
}

View File

@ -0,0 +1,91 @@
\version "2.18.2"
\include "articulate.ly"
\header {
title = "Viel volle Becher"
composer = "Otto Lob, 1896"
poet = "Langsam"
tagline = ""
}
musicOne = \relative es' {
\time 6/8
\key f \minor
\partial 8 es8 \mf |
aes4 aes8 c (bes) aes |
g4. f4 f8 |
bes4 bes8 des (c) bes |
aes4. g4 bes8 |
bes4 bes8 bes c d |
es4. (g,4) g8 |
f4^"zögernd" f8 aes4 g8 |
es4. (es8) r es^"im Zeitmass" |
bes'4 bes8 des (c) bes |
aes4. es4 es8 |
c'4 c8 es (des) c |
c4. bes4 bes8 |
bes4 des8 c4 bes8^"zögernd" |
es4. (es,4\fermata) es8\p^"verhallend" |
f4 g8 c4 bes8 |
aes4. (aes8) r4 \bar "|."
}
verseOne = \lyricmode {
Viel vol -- le Be -- cher |
klan -- gen, viel |
hel -- le Stim -- men |
san -- gen vor |
uns in die -- _ sem |
Raum, vor |
uns in die -- sem |
Raum. Doch |
Klang und Sang ver -- |
hall -- ten, ver -- |
weht sind die Ge -- |
stal -- ten, und |
al -- les war ein |
Traum! Und |
al -- les war ein |
Traum! |
}
\book {
\score {
<<
\new Voice = "one" {
\musicOne
}
\new Lyrics \lyricsto "one" {
\verseOne
}
>>
\layout {
}
}
}
\book {
\bookOutputName "viel_volle_becher_score"
\score {
<<
\new Voice = "one" {
\musicOne
}
>>
\layout {
}
}
\score {
\unfoldRepeats \articulate
<<
\new Voice = "one" {
\musicOne
}
>>
\midi {
\tempo 4 = 100
}
}
}

75
src/templates/book.j2 Normal file
View File

@ -0,0 +1,75 @@
% !Mode:: "TeX:UTF-8"
\documentclass[9pt, a5paper, openany]{scrbook}
\usepackage{fontspec}
\usepackage{lmodern}
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{tgschola}
\usepackage{tocloft}
\usepackage[unicode]{hyperref}
\usepackage{lyluatex}
\makeatletter
\newcommand{\unchapter}[1]{%
\begingroup
\let\@makechapterhead\@gobble % make \@makechapterhead do nothing
\chapter{#1}
\endgroup
}
\makeatother
\setlength{\headheight}{15pt}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{ \markboth{#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{#1}{} }
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[RE]{\textit{ \nouppercase{\leftmark}} }
\fancyhead[LO]{\textit{ \nouppercase{\rightmark}} }
\fancypagestyle{plain}{
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[RE]{\textit{ \nouppercase{Vivat Alcolica!}} }
\fancyhead[LO]{\textit{ \nouppercase{Vivat Alcolica!}} }
}
\geometry{a5paper,left=20mm,right=20mm, top=3cm, bottom=3cm}
\renewcommand\addchaptertocentry[2]{\addtocentrydefault{chapter}{}{#2}}
\renewcommand{\contentsname}{Inhalt}
\renewcommand{\cfttoctitlefont}{\huge\textbf\rmfamily}
\renewcommand{\cftchapfont}{\large\rmfamily}
\begin{document}
\begin{titlepage}
\begin{center}
\rule{\linewidth}{0.5mm} \\[0.4cm]
{ \huge \bfseries Vivat Alcolica!}
\rule{\linewidth}{0.5mm} \\[1.5cm]
\end{center}
\end{titlepage}
\pagenumbering{Roman}
\tableofcontents
\newpage
((* for score in scores *))
\unchapter{((( score.title )))}
\includely[staffsize=14]{((( score.score )))}
~\\
~\\
\input{((( score.lyrics )))}
((* endfor *))
\end{document}

View File

@ -0,0 +1,20 @@
% !Mode:: "TeX:UTF-8"
\documentclass[9pt, a5paper, openany]{scrbook}
\usepackage{fontspec}
\usepackage{lmodern}
\usepackage{fancyhdr}
\usepackage[unicode]{hyperref}
\usepackage{lyluatex}
\begin{document}
\pagenumbering{gobble}
\includely[staffsize=18]{((( score_file )))}
~\\
~\\
\input{((( lyrics_file )))}
\end{document}

23
src/tools/templater.py Executable file
View File

@ -0,0 +1,23 @@
#! /usr/bin/env python
# encoding: utf-8
import ast
import os
import sys
from jinja2 import Environment, FileSystemLoader, Template
template_dir = os.path.abspath(os.path.dirname(sys.argv[1]))
template_name = os.path.basename(sys.argv[1])
env = Environment(loader=FileSystemLoader(template_dir))
env.block_start_string = '((*'
env.block_end_string = '*))'
env.variable_start_string = '((('
env.variable_end_string = ')))'
env.comment_start_string = '((='
env.comment_end_string = '=))'
template = env.get_template(template_name)
rendered = template.render(ast.literal_eval(sys.argv[2]))
print(rendered)

170
waf vendored Executable file

File diff suppressed because one or more lines are too long

178
wscript Normal file
View File

@ -0,0 +1,178 @@
#! /usr/bin/env python
# encoding: utf-8
import os
import re
from functools import reduce
from waflib import TaskGen
APPNAME = 'kommersbuch'
VERSION = '1.0'
top = '.'
out = 'build'
src = 'src'
lib = 'lib'
src_scores = os.path.join(src, 'scores')
src_lyrics = os.path.join(src, 'lyrics')
built_lyrics_path = os.path.abspath(os.path.join(out, src, 'lyrics'))
built_scores_path = os.path.abspath(os.path.join(out, src, 'scores'))
templater_path = os.path.abspath(os.path.join(src, 'tools/templater.py'))
score_lyrics_template_path = os.path.abspath(
os.path.join(src, 'templates', 'score_lyrics.j2'))
book_template_path = os.path.abspath(
os.path.join(src, 'templates', 'book.j2'))
def dist(ctx):
ctx.excl = '**/.waf* **/*~ **/*.pyc **/*.swp **/.lock* out pdf midi music .git .DS_Store'
def configure(ctx):
ctx.find_program('lualatex', var='LUALATEX')
ctx.find_program('lilypond', var='LILYPOND')
ctx.find_program('timidity', var='TIMIDITY')
ctx.find_program('opusenc', var='OPUSENC')
def pre(ctx):
os.system('mkdir -p {1} && cp -r {0}/* {1}'.format(lib, built_lyrics_path))
TaskGen.declare_chain(
name='opus',
rule='${TIMIDITY} ${SRC} -Ow -o - | ${OPUSENC} - ${TGT}',
ext_in='.midi',
ext_out='.opus',
shell=True)
def build(ctx):
ctx.add_pre_fun(pre)
ctx.add_group('lilypond')
ctx.add_group('opus')
ctx.add_group('book')
lilypond_rule = '${LILYPOND} -o ${TGT[0].abspath().replace(".pdf", "")} ${SRC}'
lyrics_template_rule = templater_path + ' ' + \
score_lyrics_template_path + ' "{0}" > ${{TGT}}'
book_template_rule = templater_path + ' ' + \
book_template_path + ' "{0}" > ${{TGT}}'
lyrics_combined_rule = 'cd ' + built_lyrics_path + \
' && ${LUALATEX} --shell-escape '
scoredata = []
scores = ctx.path.ant_glob(src_scores + '/*.ly')
for score in scores:
filename = os.path.basename(score.abspath())
lyricsfile = os.path.join(src_lyrics, filename.replace('.ly', '.tex'))
lilyfile = filename.replace('.ly', '.pdf')
lily_score_file = '{0}_score.pdf'.format(
lilyfile.replace('.pdf', ''))
lily_midi_file = lilyfile.replace('.pdf', '_score.midi')
target_files = '{0} {1} {2}'.format(
os.path.join(src_scores, lilyfile),
os.path.join(src_scores, lily_score_file),
os.path.join(src_scores, lily_midi_file))
score_content = ''
with open(score.abspath(), 'r') as f:
score_content = f.read()
matches = re.findall('title = "(.*)"', score_content)
score_title = matches[0]
scoredata.append(
{'title': score_title,
'score': score.abspath(),
'lyrics': os.path.abspath(lyricsfile)})
ctx.set_group('lilypond')
# score without lyrics & midi
ctx(
rule=lilypond_rule,
source=score,
target=target_files,
shell=True
)
# score with lyrics
template_data = {
'score_file': score.abspath(),
'lyrics_file': os.path.abspath(lyricsfile)
}
lyrics_rule = lyrics_template_rule.format(str(template_data))
built_lyricsfile = os.path.join(
src_lyrics,
filename.replace('.ly', '_built.tex'))
ctx(
rule=lyrics_rule,
source=lyricsfile,
target=built_lyricsfile,
shell=True
)
final_lyrics_path = os.path.join(
built_scores_path, filename.replace('.ly', '_lyrics.pdf'))
lyrics_combined_rule_final = lyrics_combined_rule + \
filename.replace('.ly', '_built.tex') + \
' && cp ' + filename.replace('.ly', '_built.pdf') + \
' ' + final_lyrics_path
ctx(
rule=lyrics_combined_rule_final,
source=score.relpath() + ' ' + built_lyricsfile,
target=os.path.join(
src_scores, filename.replace('.ly', '_lyrics.pdf')),
shell=True
)
# opus
ctx.set_group('opus')
ctx(source=os.path.join(src_scores, lily_midi_file))
# booklet
template_data = {
'scores': scoredata,
}
book_rule = book_template_rule.format(str(template_data))
built_bookfile = os.path.join(src_lyrics, 'book.tex')
ctx.set_group('book')
ctx(
rule=book_rule,
source=os.path.relpath(book_template_path),
target=built_bookfile,
shell=True
)
final_book_path = os.path.join(built_scores_path, 'book.pdf')
book_combined_rule_final = lyrics_combined_rule + \
'book.tex' + \
' && cp book.pdf' + \
' ' + final_book_path
book_sources = os.path.relpath(book_template_path)
for score in scoredata:
book_sources = '{0} {1} {2}'.format(
book_sources,
os.path.relpath(score['score']),
os.path.relpath(score['lyrics']))
ctx(
rule='{0} && {0}'.format(book_combined_rule_final),
source=book_sources,
target=os.path.join(src_scores, 'book.pdf'),
shell=True
)