lilypond-0.0.38
[lilypond.git] / Documentation / lilygut.pod
blob1ac0c5290d31ae837e68f566d9dc6fcbedbc5e47
1 =head1 NAME
3 LilyGuts - doco to the internals of LilyPond
5 =head1 DESCRIPTION
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]
15 =head1 OVERVIEW
17 LilyPond is a "5-pass" system:
19 =over 5
21 =item 1. Parsing:
23 No difficult algorithms. Associated datastructures have prefix Input
24 (eg Input_score, Input_command)
26 =item 2. Processing:
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,
31 PStaff
33 =item 3. Calculation:
35 This step uses structures which have names starting with 'P'.
36 linebreaks and horizontal positions of PCols are determined. Line_of_*
37 generated.
39 =item 4. Postprocesing:
41 Some items and all spanners need computation after the PCol positions
42 are determined.
44 =item 5. Output
46 Very simple, just walk all Line_of_* and follow the links over there
48 =back
50 =head1 REQUESTS
52 [see F<request.hh>]
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
69 signs and any lyric.
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
75 that voice.
77 After C<Staff> made up her mind, the resultant items and
78 spanners are put on the PScore.
80 =over 5
82 =item C<Barcheck_req>
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
86 some voice elts.
88 =item C<Note_req>
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.
98 =item C<Rest_req>
100 Why a request? It might be a good idea to not typeset the rest, if the
101 paper is too crowded.
103 =item C<Span_req>
105 This type of request typically results in the creation of a C<Spanner>
107 =item C<Beam_req>
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
111 number of beams.
113 =item  C<Dynamic>
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
122 support.
124 =back
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
133         { % chord
134                 \music { [c() c] }
135                 \music { [e() e] }
136         }
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.
157 =head2 example:
159         c4
161 produces:
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
171 created.
173 To decide on merging, C<Complex_staff> has grouped several
174 registers. There are a few groups:
176 =item *
177 Staff wide, contains
178         Local_key_register
179         Bar_register
180         Key_register
181         Meter_register
182         Clef_register
184 =item *
185 Voice group, contains
186         Stem_beam_register
187         Script_register
188         Text_register
190 =item *
191 Voice, contains
192         Slur_register
193         Notehead_register
196 =item 1
199 =head1 BREAKING
201 [Source files: F<command.hh>, F<scommands.cc>]
203 BREAKING, PREBREAK POSTBREAK, etc.
205 So what's the deal with PREBREAK and POSTBREAK and all this
206 stuff?
208 Let's take text as an example. In German some compound
209 words change their spelling if they are broken: "backen" becomes
210 "bak-ken".  TeX has a mechanism to deal with this, you would define
211 the spelling of "backen" in TeX in this way
213         \discretionary{bak-}{ken}{backen}
215 These 3 arguments are called "prebreak", "postbreak" and "nobreak"
216 text.
218 The same problem exists when typesetting music. If a line of music is
219 broken, the next line usually gets a clef. So in TeX terms, the clef
220 is a postbreak. The same thing happens with meter signs: Normally the
221 meter follows the bar. If a line is broken at that bar, the bar along
222 with the meter stays on the "last" line, but the next line also gets a
223 meter sign after the clef. Using the previous notation,
225         \discretionary{bar meter}{clef meter}{ bar meter }
227 In Lilypond, we have the same concepts (and the same
228 terminology). Each (nonrhythmic) symbol is typeset using a Command
229 (code: TYPESET). At a breakpoint, TYPESET commands can be grouped
230 using separators (in lower case):
232         BREAK_PRE, typeset(bar), typeset(meter),
233         BREAK_MID, typeset(bar), typeset(meter),
234         BREAK_POST, typeset(clef), typeset(meter), BREAK_END 
236 The BREAK command sequence is terminated with BREAK_END, so other
237 commands (like INTERPRET) may follow this sequence.
239 =head1 SPACING
241 I think my method is the most elegant algorithm i've seen so far.
242 Some terminology: I call a vertical group of symbols (notes) which
243 start at the same time a "column".  Each line of a score has notes in
244 it, grouped in columns. The difference in starting time between those
245 columns makes it possible to determine ideal distances between those
246 columns.
248 Example:
250                 time ----->
252                 col1    col2    col3    col4
255         voice1  1               1
257         voice2  2       2       2       2
260         (1 is a whole note, 2 a half note.)
262         time_difference (col1 , col2) = 0.5 wholes,
263         time_difference (col1 , col3) = 1 wholes,
264         time_difference (col2 , col3) = 0.5 wholes,
265         etc.
267 these differences are translated into ideal distances (these translations
268 have been the subject of discussion in this thread).
270         distance (col1,col2) = 10 pt
271         distance (col1,col3) = 14.1 pt
272         distance (col2,col3) = 10 pt
273         etc.
275 as you can see, these distance are conflicting. So instead of
276 satisfying all those ideals simultaneously, a compromise is sought.
278 This is Columbus' egg: LilyPond attaches "springs" to each
279 column-pair.  each spring has an equilibrium-position which is equal to
280 the above mentioned distance, so
282 spring (col1, col2) and spring (col2,col3) try to push column 1
283 and 3 away (to a distance of 20pt) from each other, whereas the spring
284 between col 1 and col 3 tries to pull those two together (to a
285 distance of 14.1 pt). The net result of this pushing and pulling is an
286 equilibrium situation (the pushing cancels the pulling), which can be
287 calculated as the solution of Quadratic program: it is the solution
288 with minimum potential energy, for you physicists out there.
290 This algorithm for doing one line, gives a "badness" parameter for
291 each line (the potential energy). Now one can use TeX's algorithm for
292 making paragraphs (using this new version of "badness"): one should
293 try to minimise the overall badness of a paragraph. LilyPond also uses the
294 concept of pre- and post-breaks.
296 (actually, it is a bit more complicated: each column also has a
297 minimum distance to other columns, to prevent symbols from running
298 into symbols of other columns.)
300 =head1 SEE ALSO
302 =head2 References
304 [partly by Mark Basinski <basinski@arizona.edu>]
306 Herbert Chlapik, 
308 W.A. Hegazy and J. S. Gourlay. Optimal line breaking in music. In
309 ``Document Manipulation and Typography'', J.C. van Vliet (ed) 1988.
311 Ross, Ted. ``Teach yourself the art of music engraving and processing'' 
312 (3rd edition). Hansen House, Miami Beach, FL.
314         Hansen House
315         1820 West Ave.
316         Miami, FL  33139
317         (305) 532-5461
319 [This is about *engraving* i.e. professional music typesetting, and includes 
320 some good spacing tables]
322 Read, Gardner. ``Modern Rhythmic Notation.'' Indiana University Press, 1978.
324 Read, Gardner. ``Music Notation'' (2nd edition). Taplinger Publishing,
325 New York.
327 [This is as close to the ``standard'' reference work for music notation issues
328 as one is likely to get.]
331 =head2  Further reading
333 (of varying usefulness):
335 Donato, Anthony. Preparing Music Manuscript. Englewood Cliffs:
336 Prentice-Hall, 1963.
338 Donemus. "Uitgeven van muziek". Donemus Amsterdam, 1900
340 Heussenstamm, George. The Norton Manual of Music Notation. New York:
341 Norton, 1987.
343 Karkoshka, Erdhard. Notation in New Music. Trans. Ruth Koenig. New York:
344 Praeger    Publishers, 1972.  Out of print.
346 Roelofs, Ren\'e. ``Een Geautomatiseerd Systeem voor het Afdrukken van
347 Muziek'' afstudeerscriptie Bestuurlijke informatica, no 45327, Erasmus
348 universiteit Rotterdam, 1991.  (``An automated system for printing
349 music'' Master's Thesis Management and Computer Science.)
351 C. Roemer, The Art of Music Copying. Roerick music co., Sherman Oaks
352 (CA), 1973.
354 Rosecrans, Glen. Music Notation Primer. New York: Passantino, 1979.
356 Stone, Kurt. Music Notation in the Twentieth Century. New York: Norton, 1980.