3 LilyGuts - doco to the internals of LilyPond
7 This page documents some aspects of the internals of LilyPond. Some of
8 this stuff comes from e-mail I wrote, some from e-mail others wrote,
9 some are large comments taken away from the headers
11 You should use doc++ to take a peek at the sources.
13 [have to do more doco; see TODO]
17 LilyPond is a "5-pass" system:
23 No difficult algorithms. Associated datastructures have prefix Input
24 (eg Input_score, Input_command)
28 Requests are processed and granted. This is done by three cooperating
29 structeres: Staff, Staff_walker and Staff_column. In this step
30 data-structures for 3. are created and filled with data: PScore, PCol,
35 This step uses structures which have names starting with 'P'.
36 linebreaks and horizontal positions of PCols are determined. Line_of_*
39 =item 4. Postprocesing:
41 Some items and all spanners need computation after the PCol positions
46 Very simple, just walk all Line_of_* and follow the links over there
54 Any Voice_element can do a number of requests. A request is done
55 to the C<Staff> which contains the C<Voice_element>. The staff decides
56 whether to to honor the request, ignore it, or merge it with other
57 requests. Merging of requests is preferably done with other
58 requests done by members of the same voicegroups (beams, brackets, stems)
60 Please refer to the documentation of the Child classes of
61 C<Request> for explanation of each request type.
63 The result of a request will be an C<Item> or a C<Spanner>, which
64 will be put on a C<PStaff>. Note that the C<PStaff> and the original
65 C<Staff> need not have anything in common. For example, the
66 ``double'' piano Staff could interpret commands which juggle
67 melodies across the left and right hand, and may put the result in
68 two five-line PStaffs (maybe with extra PStaffs to carry the dynamic
71 The class C<Staff> should be thought as a container for the
72 C<Voice>s, and an interpreter for C<Request>s and C<Command>s.
73 Different staffs can produce different outputs; a melodious voice
74 which is put into a percussion-Staff, will be typeset as the rythm of
77 After C<Staff> made up her mind, the resultant items and
78 spanners are put on the PScore.
84 Checks during music processing if start of this voice element
85 coincides with the start of a measure. Handy to check if you left out
90 Staff has to decide if the ball should be hanging left or right. This
91 influences the horizontal dimensions of a column, and this is why
92 request processing should be done before horizontal spacing.
94 Other voices' frivolities may cause the need for accidentals, so this
95 is also for the C<Staff> to decide. The C<Staff> can decide on positioning
96 based on ottava commands and the appropriate clef.
100 Why a request? It might be a good idea to not typeset the rest, if the
101 paper is too crowded.
105 This type of request typically results in the creation of a C<Spanner>
109 Staff has to combine this request with the stem_request, since the
110 number of flags that a stem wants to carry will determine the
115 Each dynamic is bound to one note (a crescendo spanning multiple
116 notes is thought to be made of two "dynamics": a start and a stop).
117 Dynamic changes can occur in a smaller time than the length of its
118 note, therefore fore each C<Dynamic> request carries a time, measured
119 from the start of its note.
121 This subfield would come in handy, if LilyPond was adapted for midi
126 =head1 Request_register
128 In the previous section the idea of Request has been explained, but
129 this only solves one half of the problem. The other half is
130 deciding which requests should be honored, which should merged with
131 other requests, and which should be ignored. Consider this (pseudo)input
138 Both the c and e are part of a chord (they are in the same
139 Voice_group), so they should share the beams, and the two [ ] pairs
140 should be merged. The slurs OTOH are specific for each voice, so they
141 should not be shared.
143 The judge in this "allocation" problem is Staff (actually, it's child
144 C<Complex_staff>). It uses the C<Request_register> to do most of the
145 work. For each request C<Complex_staff> queries so-called
146 C<Request_register>s if they want to accept a request eg, the
147 C<Notehead_register> will accept C<Note_req>s, and turn down
148 C<Slur_req>s. If C<Complex_staff> cannot find a register that wants
149 the request, it is junked (with a warning message).
151 After all requests have been either assigned, or junked, the Register
152 will process the requests (which usually means creating an C<Item> or
153 C<Spanner>). If a C<Request_register> creates something, it tells
154 C<Complex_staff>. If all requests have been processed, then each
155 Register is notified of any created Staff_element.
163 note_request (duration 1/4)
164 stem_request (duration 1/4)
166 note_request will be taken by a C<Notehead_register>, stem_request
167 will be taken by a C<Stem_beam_register>. C<Notehead_register> creates
168 a C<Notehead>, C<Stem_beam_register> creates a C<Stem>. Both announce
169 this to the Staff. Staff will tell C<Stem_beam_register> about the
170 C<Notehead>, which will add the C<Notehead> to the C<Stem> it just
173 To decide on merging, C<Complex_staff> has grouped several
174 registers. There are a few groups:
188 Voice group, contains
207 [Source files: F<command.hh>, F<scommands.cc>]
209 BREAKING, PREBREAK POSTBREAK, etc.
211 So what's the deal with PREBREAK and POSTBREAK and all this
214 Let's take text as an example. In German some compound
215 words change their spelling if they are broken: "backen" becomes
216 "bak-ken". TeX has a mechanism to deal with this, you would define
217 the spelling of "backen" in TeX in this way
219 \discretionary{bak-}{ken}{backen}
221 These 3 arguments are called "prebreak", "postbreak" and "nobreak"
224 The same problem exists when typesetting music. If a line of music is
225 broken, the next line usually gets a clef. So in TeX terms, the clef
226 is a postbreak. The same thing happens with meter signs: Normally the
227 meter follows the bar. If a line is broken at that bar, the bar along
228 with the meter stays on the "last" line, but the next line also gets a
229 meter sign after the clef. Using the previous notation,
231 \discretionary{bar meter}{clef meter}{ bar meter }
233 In Lilypond, we have the same concepts (and the same
234 terminology). Each (nonrhythmic) symbol is typeset using a Command
235 (code: TYPESET). At a breakpoint, TYPESET commands can be grouped
236 using separators (in lower case):
238 BREAK_PRE, typeset(bar), typeset(meter),
239 BREAK_MID, typeset(bar), typeset(meter),
240 BREAK_POST, typeset(clef), typeset(meter), BREAK_END
242 The BREAK command sequence is terminated with BREAK_END, so other
243 commands (like INTERPRET) may follow this sequence.
247 I think my method is the most elegant algorithm i've seen so far.
248 Some terminology: I call a vertical group of symbols (notes) which
249 start at the same time a "column". Each line of a score has notes in
250 it, grouped in columns. The difference in starting time between those
251 columns makes it possible to determine ideal distances between those
266 (1 is a whole note, 2 a half note.)
268 time_difference (col1 , col2) = 0.5 wholes,
269 time_difference (col1 , col3) = 1 wholes,
270 time_difference (col2 , col3) = 0.5 wholes,
273 these differences are translated into ideal distances (these translations
274 have been the subject of discussion in this thread).
276 distance (col1,col2) = 10 pt
277 distance (col1,col3) = 14.1 pt
278 distance (col2,col3) = 10 pt
281 as you can see, these distance are conflicting. So instead of
282 satisfying all those ideals simultaneously, a compromise is sought.
284 This is Columbus' egg: LilyPond attaches "springs" to each
285 column-pair. each spring has an equilibrium-position which is equal to
286 the above mentioned distance, so
288 spring (col1, col2) and spring (col2,col3) try to push column 1
289 and 3 away (to a distance of 20pt) from each other, whereas the spring
290 between col 1 and col 3 tries to pull those two together (to a
291 distance of 14.1 pt). The net result of this pushing and pulling is an
292 equilibrium situation (the pushing cancels the pulling), which can be
293 calculated as the solution of Quadratic program: it is the solution
294 with minimum potential energy, for you physicists out there.
296 This algorithm for doing one line, gives a "badness" parameter for
297 each line (the potential energy). Now one can use TeX's algorithm for
298 making paragraphs (using this new version of "badness"): one should
299 try to minimise the overall badness of a paragraph. LilyPond also uses the
300 concept of pre- and post-breaks.
302 (actually, it is a bit more complicated: each column also has a
303 minimum distance to other columns, to prevent symbols from running
304 into symbols of other columns.)
310 [partly by Mark Basinski <basinski@arizona.edu>]
314 W.A. Hegazy and J. S. Gourlay. Optimal line breaking in music. In
315 ``Document Manipulation and Typography'', J.C. van Vliet (ed) 1988.
317 Ross, Ted. ``Teach yourself the art of music engraving and processing''
318 (3rd edition). Hansen House, Miami Beach, FL.
325 [This is about I<engraving> i.e. professional music typesetting, and includes
326 some good spacing tables]
328 Read, Gardner. ``Modern Rhythmic Notation.'' Indiana University Press, 1978.
330 Read, Gardner. ``Music Notation'' (2nd edition). Taplinger Publishing,
333 [This is as close to the ``standard'' reference work for music notation issues
334 as one is likely to get.]
337 =head2 Further reading
339 (of varying usefulness):
341 Donato, Anthony. Preparing Music Manuscript. Englewood Cliffs:
344 Donemus. "Uitgeven van muziek". Donemus Amsterdam, 1900
346 Heussenstamm, George. The Norton Manual of Music Notation. New York:
349 Karkoshka, Erdhard. Notation in New Music. Trans. Ruth Koenig. New York:
350 Praeger Publishers, 1972. Out of print.
352 Roelofs, Ren\'e. ``Een Geautomatiseerd Systeem voor het Afdrukken van
353 Muziek'' afstudeerscriptie Bestuurlijke informatica, no 45327, Erasmus
354 universiteit Rotterdam, 1991. (``An automated system for printing
355 music'' Master's Thesis Management and Computer Science.)
357 C. Roemer, The Art of Music Copying. Roerick music co., Sherman Oaks
360 Rosecrans, Glen. Music Notation Primer. New York: Passantino, 1979.
362 Stone, Kurt. Music Notation in the Twentieth Century. New York: Norton, 1980.