I'm glad you asked! The program is intended to have a performance
mode: you
enter a set of requirements and restrictions on the command-line
(this is the
creative part!) and then see what it produces.
The program then does some combinatorial number-crunching, which
can take a
long time to complete - in some cases unrealistically long.
However, it uses
Python generators, so that each small unit of output (i.e., bar) is
yielded
immediately and then forgotten about, and we begin to see output
straight
away. Without this feature, some of the larger operations would
simply fill
the memory and never complete. This way, it can begin to "perform"
immediately.
Of course, it is possible to play midi files (or scores) produced
by Lilypond
at the end of the process, but that may be much later, or never.
To date, I've been using the sox synth to play the results, but
that's pretty
limited; and then by triggering some piano samples, but I realized
I was
re-inventing midi; and since my program already includes a function
to
convert my numerical representation of music into Lilypond-friendly
strings,
the midi data is already being produced.
If only I could get my hands on it!