Here's the problem with existing books of Christmas carols:
- They don't have all the carols I like.
- They take up space with carols I don't like.
- They pick bad arrangements.
- They pick bad lyrics.
- It's expensive to buy enough copies to have a good caroling party.
This is a book of my favorite four-part Christmas carols, using Ben Kuhn's carols
project as a jumping-off point. If you see stuff you like, or gaps that demand to be filled, feel free to fork this repo, make PRs, etc.!
This repo also contains the latest generated versions of the carol book:
- Full-Size (with links in the pdf, good for singing off a tablet)
- Booklet (for printing and folding into a booklet)
Each carol lives in its own Lilypond file inside the carols
subdirectory. The build script (build.py
) builds each of this Lilypond files into a pdf in the build
subdirectory. The final product is a pdf generated via LaTeX (by default, carols.pdf
).
The build.py
script takes care of compiling any Lilypond files that have changed and (re)building the book. By default, it dumps the final product in ./carols.pdf
, though this (and many other settings) can be configured via the command line (run build.py -h
for more info).
Carols are compiled into pdfs via Lilypond. However, last I heard, Lilypond didn't work on the latest MacOS 😢 so now this project runs Lilypond in a container (with thanks to Kyle W. Baldwin). To compile a single carol, use the compile_with_docker.sh
script. E.g. to compile carols/my_carol.ly
to build/my_carol.pdf
, run:
./compile_with_docker.sh my_carol
You should have Docker and LaTeX installed, as well as Python 3 and the Python dependencies (pip install -r requirements.txt
).
If you run the build script with flag --booklet
, in addition to the normal output, it will generate a version of your carol packet with the pages duplexed and interleaved for booklet printing:
Print your booklet file double-sided ("flip on short edge") and you can fold it in half, staple if (if you want, I don't care), and have a nice little booklet of carols.
In order to generate a table of contents, the build script parses through each Lilypond file to grab some metadata from the \header
block. By default, a carol is entered in the table of contents as it's title
(with any leading articles moved to the back). If for some reason you want to override this behavior, put the desired title in the header matter as toc_as
.
\header {
title = "Lully Lullay (The Coventry Carol)"
toc_as = "The Coventry Carol"
poet = "Robert Croo, 1534"
composer = "16th Centry English Carol"
arranger = "arr. Martin Fallas Shaw (1875-1958)"
}