1 \input texinfo @c -*-texinfo-*-
2 @setfilename internals.info
3 @settitle LilyPond internals
5 @node Top, LilyPond internals, (dir), (dir)
10 * LilyPond internals::
24 @node LilyPond internals, , Top, Top
28 * Request_engraver:: Request_engraver
32 @chapter Getting involved
34 Please help us make LilyPond a better program. You can help LilyPond in
35 several ways. Not all tasks requiring programming or understanding the
36 full source code. You can write to the mailing list
37 (@email{gnu-music-discuss@@gnu.org} for more information)
39 @unnumberedsubsec Users
41 Mutopia needs your help. The mutopia project is a collection of public
42 domain sheet music. You can help the project by entering music and
43 submitting. Point your browser to the
44 @uref{http://sca.uwaterloo.ca/Mutopia, Mutopia webpage}
46 @unnumberedsubsec Font designers
48 Our set of glyphs (the Feta font) is far from complete. If you know a
49 little MetaFont you can contribute a glyph
51 @unnumberedsubsec Writers
53 The documentation of LilyPond and related utilities needs a lot of work.
55 @unnumberedsubsec Translators
57 LilyPond is completely ready for internationalized messages, but there
58 are only three translations so far.
60 @unnumberedsubsec Hackers
62 There are lots of possibilities of improving the program itself. There are
63 both small projects and big ones. Most of them are listed in the TODO
64 file. A interesting and very big project is writing a GUI frontend to
68 @unnumberedsubsec Website designers
70 The current website for LilyPond is neat and simple, but it is not very
71 pretty. We would like to have a website with pretty pictures, one that
72 looks appealing to new users.
75 @chapter LilyPond internals
78 This documents some aspects of the internals of GNU LilyPond. Some of
79 this stuff comes from e-mail I wrote, some from e-mail others wrote,
80 some are large comments taken away from the headers. This page may be
81 a little incoherent. Unfortunately, it is also quite outdated. A
82 more thorough and understandable document is in the works.
84 You should use @code{doc++} to take a peek at the sources.
86 @node Overview, mudela, Top, Top
89 GNU LilyPond is a "multi-pass" system. The different passes have been
90 created so that they do not depend on each other. In a later stage
91 some parts may be moved into libraries, or seperate programs, or they
92 might be integrated in larger systems.
98 No difficult algorithms. The .ly file is read, and converted to a list
99 of @code{Scores}, which each contain @code{Music} and paper/midi-definitions.
101 @item Interpreting music
103 The music is walked through in time-order. The iterators which do the
104 walking report Music to Translators which use this information to
105 create elements, either MIDI or "visual" elements. The translators
106 form a hierarchy; the ones for paper output are Engravers, for MIDI
109 The translators swallow Music (mostly atomic gobs called Requests),
110 create elements, broadcast them to other translators on higher or same
111 level in the hierarchy:
113 The stem of a voice A is broadcast to the staff which contains A, but
114 not to the stems, beams and noteheads of a different voice (say B) or
115 a different staff. The stem and noteheads of A are coupled, because
116 the the Note_heads_engraver broadcasts its heads, and the Stem_engraver catches
119 The engraver which agrees to handle a request decides whether to to
120 honor the request, ignore it, or merge it with other requests. Merging
121 of requests is preferably done with other requests done by members of
122 the same voicegroups (beams, brackets, stems). In this way you can put
123 the voices of 2 instruments in a conductor's score so they make chords
124 (the Beam requests of both instruments will be merged).
128 Breakable stuff (eg. clefs and bars) are copied into pre and
133 Some dependencies are resolved, such as the direction of stems, beams,
134 and "horizontal" placement issues (the order of clefs, keys etc,
135 placement of chords in multi-voice music),
137 @item Break calculation:
139 The lines and horizontal positions of the columns are determined.
143 Through some magical interactions with Line_of_score and Super_elem
144 (check out the source) the "lines" are produced.
146 All other spanners can figure across which lines they are spread. If
147 applicable, they break themselves into pieces. After this, each piece
148 (or, if there are no pieces, the original spanner itself) throws out
149 any dependencies which are in the wrong line.
153 Some items and all spanners need computation after the Paper_column
154 positions are determined. Examples: slurs, vertical positions of
161 @node mudela, Request_engraver, Overview, Top
164 Most information is stored in the form of a request. In music
165 typesetting, the user might want to cram a lot more symbols on the
166 paper than actually fits. To reflect this idea (the user asks more
167 than we can do), the container for this data is called Request.
169 In a lot of other formats this would be called an 'Event'
172 @item @code{Barcheck_req}
173 Checks during music processing if start of this voice element
174 coincides with the start of a measure. Handy to check if you left out
176 @item @code{Note_req}
177 LilyPond has to decide if the ball should be hanging left or
178 right. This influences the horizontal dimensions of a column, and this
179 is why request processing should be done before horizontal spacing.
180 Other voices' frivolities may cause the need for accidentals, so this
181 is also for the to decide. The engraver can decide on positioning based on
182 ottava commands and the appropriate clef.
183 @item @code{Rest_req}
185 @item @code{Span_req}
186 This type of request typically results in the creation of a @code{Spanner}
187 @item @code{Beam_req}
189 Engraver has to combine this request with the stem_request, since the
190 number of flags that a stem wants to carry will determine the
193 Each dynamic is bound to one note (a crescendo spanning multiple
194 notes is thought to be made of two "dynamics": a start and a stop).
195 Dynamic changes can occur in a smaller time than the length of its
196 note, therefore fore each @code{Dynamic} request carries a time, measured
197 from the start of its note.
200 @node Request_engraver, , mudela, Top
201 @section Request_engraver
203 In the previous section the idea of Request has been explained, but
204 this only solves one half of the problem. The other half is deciding
205 which requests should be honored, which should merged with other
206 requests, and which should be ignored. Consider this input
210 \type Staff < % chord
211 @{ \meter 2/4; [c8 c8] @}
212 @{\meter 2/4; [e8 e8] @}
217 Both the cs and es are part of a staff (they are in the same
218 Voice_group), so they should share meters, but the two [ ] pairs
221 The judge in this "allocation" problem a set of brokers: the requests
222 are transmitted to so-called engravers which respond if they want to
223 accept a request eg, the @code{Notehead_engraver} will accept
224 @code{Note_req}s, and turn down @code{Slur_req}s. If the Music_iterator
225 cannot find a engraver that wants the request, it is junked (with a
228 After all requests have been either assigned, or junked, the Engraver
229 will process the requests (which usually means creating an @code{Item}
230 or @code{Spanner}). If a @code{Request_engraver} creates something, it
231 tells the enclosing context. If all items/spanners have been created,
232 then each Engraver is notified of any created Score_element, via a
235 @unnumberedsubsec example:
247 Note_request (duration 1/4)
248 Stem_request (duration 1/4)
252 Note_request will be taken by a @code{Notehead_engraver}, stem_request
253 will be taken by a @code{Stem_beam_engraver}. @code{Notehead_engraver}
254 creates a @code{Notehead}, @code{Stem_beam_engraver} creates a
255 @code{Stem}. Both announce this to the Staff_engraver. Staff_engraver
256 will tell @code{Stem_beam_engraver} about the @code{Notehead}, which
257 will add the @code{Notehead} to the @code{Stem} it just created.
259 To decide on merging, several engravers have been grouped. Please
260 check @file{init/engraver.ly}.
264 @node Graphic elements, , , Top
265 @section Graphic elements
268 Music notation is composed of a sets of interrelated glyphs. In
269 Lilypond every glyph usually is represented by one object, a so-called
270 Graphic Object. The primary relations between graphic objects involve
274 @item consecutive notes are printed left to right, grouped in a staff
275 @item simultaneous notes are horizontally aligned (internally grouped in
277 @item the staccato mark is horizontally centered on the note it applies
281 The abstract encoding of such relations is done with the concept
282 @dfn{reference point}. The reference point (in X direction) of the
283 staccato mark is the note it applies to. The (X) position of the
284 staccato mark is stored relative to the position of the note head. This
285 means that the staccato will always maintain a fixed offset wrt to the
286 note head, whereever the head is moved to.
288 In the same vein, all notes on a staff have their Y positions stored
289 relative to an abstract object called Axis_group_spanner. If the
290 Axis_group_spanner of one staff is moved, the absolute Y positions of
291 all objects in that spanner change along, in effect causing the staff
292 and all its contents to move as a whole.
294 Each graphic object stores a pointer and an relative offset for each
295 direction: one for the X-axis, one for the Y-axis. For example, the X
296 parent of a Note_head usually is a Note_column. The X parent of a
297 Note_column usually is either a Collision or a Paper_column. The X
298 parent of a Collision usually is a Paper_column. If the Collision
299 moves, all Note_heads that have that Collision as parent also move, but
300 the absolute position of the Paper_column does not change.
302 To build a graphical score with Graphic_elements, conceptually, one
303 needs to have one Root object (in Lilypond: Line_of_score), and
304 recursively attach objects to the Root. However, due to the nature
305 of the context selection mechanisms, it turns out to be more
306 advantageous to construct the tree the other way around: first small
307 trees (note heads, barlines etc.) are created, and these are
308 subsequently composed into larger trees, which are finally hung on a
309 Paper_column (in X direction) or Line_of_score (in Y direction).
311 The structure of the X,Y parent relations are determined by the
312 engravers and notation contexts:
314 The most important X-axis parent relation depends on the timing: notes
315 that come earlier are attached to Paper_column that will be positioned
318 The most important Y-axis relation depends on containment of contexts:
319 notes (created in a Thread or Voice context) are put in the staff where
320 the originating context lives in.
322 Graphical_axis_groups are special graphic objects, that are designed to
323 function as a parent. The size of a Graphical_axis_groups group is the
324 union of its children.
326 @node Score elements, , , Top
328 Besides relative positions there are lots of other relations between
329 elements. Lilypond does not contain other specialized relation
330 management (Like the relative positioning code). In stead, objects can
331 be connected through dependencies, which sets the order in which objects
334 Example: the direction of a beamed stem should equal the direction of
335 the beam. When the stem is a added to the beam, a dependency on the
336 beam is set in the stem: this means that @code{Beam::do_pre_processing
337 ()} (which does various direction related things) will be called before
338 @code{Stem::do_pre_processing ()}.
340 The code that manages dependencies resides in the class
341 @code{Score_element}, a derived class of @code{Graphical_element}. The
342 bulk of the code handles line breaking related issues.
344 To sketch the problems with line breaking: suppose a slur spans a line
348 c4( c'''' c | \break d d )d
351 In this case, the slur will appear as two parts, the first part spanning
352 the first three notes (the @code{c}s), the second spanning the last
353 three (the @code{d}s). Within Lilypond this is modeled as breaking the
354 slur in parts: from the Original slur, two new clones of the old slur
355 are made. Initially both clones depend on the six notes. After the
356 hairy code in Score_element, Spanner and Item which does substitutions
357 in sets of dependencies, the first clone depends on the first three
358 notes, the second on the last three.
360 The major derived classes of Score_element are Item and Spanner.
361 An item has one horizontal position. A spanner hangs on two items.
368 An item is a score element that is associated with only one
369 Paper_column. Examples are note heads, clefs, sup and superscripts, etc.
370 Item is a derived class of Score_element.
372 The shape of an item is known before the break calculations, and line
373 spacing depends on the size of items: very wide items need more space
374 than very small ones.
376 An additional complication is the behavior of items at linebreaks. For
377 example, when you do a time signature change, you get only one symbol.
378 If it occurs at a linebreak, the new time signature must be printed both
379 before and after the linebreak. Other `breakable symbols' such as
380 clefs, and bar lines also exhibit this behavior.
382 if a line of music is broken, the next line usually gets a clef. So in
383 TeX terms, the clef is a postbreak. The same thing happens with meter
384 signs: Normally the meter follows the bar. If a line is broken at that
385 bar, the bar along with the meter stays on the "last" line, but the next
386 line also gets a meter sign after the clef. To support this,
387 breakable items are generated in the three versions: original
388 (unbroken), left (before line break) and right (after line break).
389 During the line spacing, these versions are used to try how the spacing
392 Once the definitive spacing is determined, dependencies (and various
393 other pointers) are substituted such that all dependencies point at the
394 active items: either they point at the original, or they point at left
397 @node Spanners, , , Top
400 Spanners are symbols that are of variable shape, eg. Slurs, beams, etc.
401 Spanners is a derived class of Score_element.
403 The final shape can only be determined after the line breaking process.
404 All spanners are spanned on two items, called the left and right
405 boundary item. The X reference point is the left boundary item.
408 @node Future work, , , Top
411 There are plans to unify Spanner and Item, so there will no longer be
412 such a clear distinction between the two. Right now, Score_elements are
413 always either Item or either Spanner.
415 Most of the properties of a graphic object are now member variables of
416 the classes involved. To offer configurability, we want to move these
417 variables to scheme (GUILE) variables, and no longer use C++ code to
418 calculate them, but use Scheme functions.
420 @node Coding standards, , , Top
422 @chapter CodingStyle - standards while programming for GNU
425 Functions and methods do not return errorcodes.
428 @unnumberedsubsec Languages
430 C++ and Python are preferred. Perl is not. Python code should use an
431 indent of 8, using TAB characters.
433 @unnumberedsubsec Filenames
435 Definitions of classes that are only accessed via pointers
436 (*) or references (&) shall not be included as include files.
442 ".cc" Implementation files
443 ".icc" Inline definition files
444 ".tcc" non inline Template defs
450 (setq auto-mode-alist
451 (append '(("\\.make$" . makefile-mode)
452 ("\\.cc$" . c++-mode)
453 ("\\.icc$" . c++-mode)
454 ("\\.tcc$" . c++-mode)
455 ("\\.hh$" . c++-mode)
456 ("\\.pod$" . text-mode)
462 The class Class_name_abbreviation is coded in @file{class-name-abbr.*}
464 @unnumberedsubsec Indentation
466 Standard GNU coding style is used. In emacs:
469 (add-hook 'c++-mode-hook
470 '(lambda() (c-set-style "gnu")
475 If you like using font-lock, you can also add this to your @file{.emacs}:
478 (setq font-lock-maximum-decoration t)
479 (setq c++-font-lock-keywords-3
481 c++-font-lock-keywords-3
482 '(("\\b\\([a-zA-Z_]+_\\)\\b" 1 font-lock-variable-name-face)
483 ("\\b\\([A-Z]+[a-z_]+\\)\\b" 1 font-lock-type-face))
487 @unnumberedsubsec Classes and Types
493 @unnumberedsubsec Members
497 Type Class::member_type_
498 Type Class::member_type ()
501 the @code{type} is a Hungarian notation postfix for @code{Type}. See below
503 @unnumberedsubsec Macros
505 Macros should be written completely in uppercase
507 The code should not be compilable if proper macro declarations are not
510 Don't laugh. It took us a whole evening/night to figure out one of
511 these bugs, because we had a macro that looked like
512 @code{DECLARE_VIRTUAL_FUNCTIONS ()}.
514 @unnumberedsubsec Broken code
516 Broken code (hardwired dependencies, hardwired constants, slow
517 algorithms and obvious limitations) should be marked as such: either
518 with a verbose TODO, or with a short "ugh" comment.
520 @unnumberedsubsec Comments
522 The source is commented in the DOC++ style. Check out doc++ at
523 @uref{http://www.zib.de/Visual/software/doc++/index.html}
528 C style comments for multiline comments.
529 They come before the thing to document.
535 Long class documentation.
538 TODO Fix boring_member ()
549 short memo. long doco of member ()
550 @@param description of arguments
553 Rettype member (Argtype);
557 data_member_ = 121; // ugh
564 Unfortunately most of the code isn't really documented that good.
566 @unnumberedsubsec Members (2)
572 ///check that *this satisfies its invariants, abort if not.
575 /// print *this (and substructures) to debugging log
579 protected member. Usually invoked by non-virtual XXXX ()
583 /**add some data to *this.
584 Presence of these methods usually imply that it is not feasible to this
589 /// replace some data of *this
594 @unnumberedsubsec Constructor
596 Every class should have a default constructor.
598 Don't use non-default constructors if this can be avoided:
606 is less readable than
619 Foo f(Foo_convert::int_to_foo (1))
623 @unnumberedsec Hungarian notation naming convention
625 Proposed is a naming convention derived from the so-called
626 @emph{Hungarian Notation}. Macros, @code{enum}s and @code{const}s are all
627 uppercase, with the parts of the names separated by underscores.
629 The hungarian notation is to be used when variables are not declared
630 near usage (mostly in member variables and functions).
632 @unnumberedsubsec Types
636 unsigned char. (The postfix _by is ambiguous)
650 Zero terminated c string
655 @unnumberedsubsec User defined types
663 Slur* slur_p = new Slur;
667 @unnumberedsubsec Modifiers
669 The following types modify the meaning of the prefix.
670 These are preceded by the prefixes:
678 const. Note that the proper order is @code{Type const}
679 i.s.o. @code{const Type}
681 A const pointer. This would be equivalent to @code{_c_l}, but since any
682 "const" pointer has to be a link (you can't delete a const pointer),
685 temporary pointer to object (link)
687 pointer to newed object
692 @unnumberedsubsec Adjective
694 Adjectives such as global and static should be spelled out in full.
695 They come before the noun that they refer to, just as in normal english.
699 foo_global_i: a global variable of type int commonly called "foo".
703 static class members do not need the static_ prefix in the name (the
704 Class::var notation usually makes it clear that it is static)
708 Variable loop: an integer
710 Temporary variable: an unsigned integer
712 Variable test: a character
713 @item @code{first_name_str}
714 Variable first_name: a String class object
715 @item @code{last_name_ch_a}
716 Variable last_name: a @code{char} array
718 Variable foo: an @code{Int*} that you must delete
720 Variable bar: an @code{Int*} that you must not delete
723 Generally default arguments are taboo, except for nil pointers.
725 The naming convention can be quite conveniently memorised, by
726 expressing the type in english, and abbreviating it
730 static Array<int*> foo
734 @code{foo} can be described as "the static int-pointer user-array", so you get
743 @unnumberedsec Miscellaneous
745 For some tasks, some scripts are supplied, notably creating patches, a
746 mirror of the website, generating the header to put over cc and hh
747 files, doing a release.
751 @node Making patches, , , Top
757 PATCHES - track and distribute your code changes
759 This page documents how to distribute your changes to GNU lilypond
761 We would like to have unified context diffs with full pathnames. A
762 script automating supplied with Lily.
764 Distributing a change normally goes like this:
767 @item make your fix/add your code
768 @item Add changes to CHANGES, and add yourself to Documentation/topdocs/AUTHORS.texi
769 @item generate a patch,
770 @item e-mail your patch to one of the mailing lists
771 gnu-music-discuss@@gnu.org or bug-gnu-music@@gnu.org
774 Please do not send entire files, even if the patch is bigger than the
775 original. A patch makes it clear what is changed, and it won't
776 overwrite previous (not yet released) changes.
778 @unnumberedsec Generating a patch
783 make -C lilypond-x.y.z/ distclean
784 make -C lilypond-x.y.z.NEW/ distclean
785 diff -urN lilypond-x.y.z/ lilypond-x.y.z.NEW/
788 Complicated (but automated) version:
790 In @file{VERSION}, set MY_PATCH_LEVEL:
800 In @file{CHANGES}, enter a summary of changes:
807 Then, from the top of Lily's source tree, type
813 These handy python scripts assume a directory structure which looks
818 lilypond -> lilypond-x.y.z # symlink to development directory
819 lilypond-x.y.z/ # current development
820 patches/ # patches between different releases
821 releases/ # .tar.gz releases
825 (Some scripts also assume this lives in @file{$HOME/usr/src}).
828 @unnumberedsec Applying patches
831 If you're following LilyPond development regularly, you probably want to
832 download just the patch for each subsequent release.
833 After downloading the patch (into the patches directory, of course), simply
838 gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
842 and don't forget to make automatically generated files:
846 autoconf footnote(patches don't include automatically generated files,
847 i.e. file(configure) and files generated by file(configure).)