lilypond-1.3.27
[lilypond.git] / Documentation / programmer / hacking.texi
blobda36f2f0efc24e020030c3efe7999f20c481388d
1 \input texinfo @c -*-texinfo-*-
2 @setfilename internals.info
3 @settitle LilyPond internals
5 @node Top, LilyPond internals, (dir), (dir)
6 @top
9 @menu
10 * LilyPond internals::
11 * Overview::
12 * mudela::                      
13 * Request_engraver::            
14 * Graphic elements::
15 * Score elements::
16 * Items::
17 * Spanners::
18 * Future work::
19 * Coding standards::
20 * Making patches::
22 @end menu
24 @node LilyPond internals,  , Top, Top
25 @menu
26 * Overview::                      Overview
27 * mudela::                        mudela
28 * Request_engraver::              Request_engraver
29 @end menu
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
65 LilyPond.
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
87 @section Overview
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.
94 @table @samp
96 @item Parsing:
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
107 Performers.
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
117 these.
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).
126 @item Prebreaking
128 Breakable stuff (eg. clefs and bars) are copied into pre and
129 postbreaks.
131 @item Preprocessing
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.
141 @item Breaking
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.
151 @item Postprocesing:
153 Some items and all spanners need computation after the Paper_column
154 positions are determined. Examples: slurs, vertical positions of
155 staffs.
157 @item Output paper
159 @end table
161 @node mudela, Request_engraver, Overview, Top
162 @section mudela
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'
171 @table @samp
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
175     some voice elts.
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}
184     Typeset a rest.
185 @item @code{Span_req}
186     This type of request typically results in the creation of a @code{Spanner}
187 @item @code{Beam_req}
188     Start/stop a beam.
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
191     number of beams.
192 @item @code{Dynamic}
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.
198 @end table
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
208 @example 
210         \type Staff < % chord
211                 @{ \meter 2/4; [c8 c8] @}
212                 @{\meter 2/4;  [e8 e8] @}
213         >
215 @end example 
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
219 should be merged.
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
226 warning message).
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
233 broadcasting system.
235 @unnumberedsubsec example:
237 @example 
239         c4
241 @end example 
243 produces:
245 @example 
247         Note_request (duration 1/4)
248         Stem_request (duration 1/4)
250 @end example 
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
271 positions:
273 @itemize
274 @item consecutive notes are printed left to right, grouped  in a staff
275 @item simultaneous notes are horizontally aligned (internally grouped in
276 a paper column).
277 @item  the staccato mark is horizontally centered on the note it applies
279 @end itemize
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
316 more to the left.
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
332 are to be processed.
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
345 break,
346 @example
348 c4(  c'''' c | \break d d )d
350 @end example
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.
363 @node Items, , , Top
364 @section 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
390 of a  line works out.
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
395 and right.
397 @node Spanners, , , Top
398 @section Spanners
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
409 @section Future work
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
423 LilyPond
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.
438 filenames
440 @example 
441         ".hh"   Include files
442         ".cc"   Implementation files
443         ".icc"  Inline definition files
444         ".tcc"  non inline Template defs
445 @end example 
447 in emacs:
449 @example 
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)         
457                         )
458                       auto-mode-alist))
459 @end example 
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:
468 @example 
469         (add-hook 'c++-mode-hook
470                   '(lambda() (c-set-style "gnu")
471                      )
472                   )
473 @end example 
475 If you like using font-lock, you can also add this to your @file{.emacs}:
477 @example 
478         (setq font-lock-maximum-decoration t)
479         (setq c++-font-lock-keywords-3 
480               (append
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))
484                ))
485 @end example 
487 @unnumberedsubsec Classes and Types
489 @example 
490         This_is_a_class
491 @end example 
493 @unnumberedsubsec Members
495 @example 
496         Class::member ()
497         Type Class::member_type_
498         Type Class::member_type ()
499 @end example 
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
508 included. 
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}
525 @example 
527         /*
528                 C style comments for multiline comments.
529                 They come before the thing to document.
530                 [...]
531         */
533         /**
534                 short description.
535                 Long class documentation.
536                 (Hungarian postfix)
538                 TODO Fix boring_member ()
539         */
540         class Class @{
541                 /**
542                   short description.
543                   long description
544                 */
546                 Data data_member_;
548                 /**
549                         short memo. long doco of member ()
550                         @@param description of arguments
551                         @@return Rettype
552                 */
553                 Rettype member (Argtype);
555                 /// memo only
556                 boring_member () @{
557                         data_member_ = 121; // ugh
558                 @}
559         @};
561 @end example 
563         
564 Unfortunately most of the code isn't really documented that good.
566 @unnumberedsubsec Members (2)
568 Standard methods:
570 @example 
572         ///check that *this satisfies its invariants, abort if not.
573         void OK () const
575         /// print *this (and substructures) to debugging log
576         void print () const
578         /**
579         protected member. Usually invoked by non-virtual XXXX ()
580         */
581         virtual do_XXXX ()
583         /**add some data to *this.
584         Presence of these methods usually imply that it is not feasible to this
585         via  a constructor
586         */
587         add (..)
589         /// replace some data of *this
590         set (..)
592 @end example 
594 @unnumberedsubsec Constructor
596 Every class should have a default constructor.  
598 Don't use non-default constructors if this can be avoided:
600 @example 
602         Foo f(1)
604 @end example 
606 is less readable than
608 @example 
610         Foo f;
611         f.x = 1
613 @end example 
615 or 
617 @example 
619         Foo f(Foo_convert::int_to_foo (1))
621 @end example 
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
634 @table @samp
635 @item @code{byte}
636     unsigned char. (The postfix _by is ambiguous)
637 @item @code{b}
638     bool
639 @item @code{bi}
640     bit
641 @item @code{ch}
642     char
643 @item @code{f}
644     float
645 @item @code{i}
646     signed integer
647 @item @code{str}
648     string class
649 @item @code{sz}
650     Zero terminated c string
651 @item @code{u}
652     unsigned integer
653 @end table
655 @unnumberedsubsec User defined types
657 @example 
659         /** Slur blah. blah.
660         (slur)
661         */
662         class Slur @{@};
663         Slur* slur_p = new Slur;
665 @end example 
667 @unnumberedsubsec Modifiers
669 The following types modify the meaning of the prefix. 
670 These are preceded by the prefixes:
672 @table @samp
673 @item @code{a}
674     array
675 @item @code{array}
676     user built array.
677 @item @code{c}
678     const. Note that the proper order is @code{Type const}
679     i.s.o. @code{const Type}
680 @item @code{C}
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),
683     it is superfluous.
684 @item @code{l}
685     temporary pointer to object (link)
686 @item @code{p}
687     pointer to newed object
688 @item @code{r}
689     reference
690 @end table
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.
697 @example 
699 foo_global_i: a global variable of type int commonly called "foo".
701 @end example 
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)
706 @table @samp
707 @item @code{loop_i}
708     Variable loop: an integer
709 @item @code{u}
710     Temporary variable: an unsigned integer
711 @item @code{test_ch}
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
717 @item @code{foo_i_p}
718     Variable foo: an @code{Int*} that you must delete
719 @item @code{bar_i_l}
720     Variable bar: an @code{Int*} that you must not delete
721 @end table
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
728 @example 
730         static Array<int*> foo
732 @end example 
734 @code{foo} can be described as "the static int-pointer user-array", so you get
736 @example 
738         foo_static_l_arr
740 @end example 
743 @unnumberedsec Miscellaneous
744     
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.
749 Use them.
751 @node Making patches,  , , Top
754 @unnumberedsec name
755     
757 PATCHES - track and distribute your code changes
759 This page documents how to distribute your changes to GNU lilypond
760     
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:
766 @itemize @bullet
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
772 @end itemize
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
780 Simple version: run
782 @example
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/
786 @end example
788 Complicated (but automated) version:
790 In @file{VERSION}, set MY_PATCH_LEVEL:
792 @example 
794     VERSION:
795         ...
796         MY_PATCH_LEVEL=jcn1
798 @end example 
800 In @file{CHANGES}, enter a summary of changes:
802 @example 
803         pl 0.1.73.jcn1
804                 - added PATCHES.texi
805 @end example 
807 Then, from the top of Lily's source tree, type
809 @example 
810     make release
811 @end example 
813 These handy python scripts assume a directory structure which looks
814 like:
816 @example 
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
823 @end example 
825 (Some scripts also assume this lives in  @file{$HOME/usr/src}).
827         
828 @unnumberedsec Applying patches
829     
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 
834 apply it:
836 @example 
838     gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
840 @end example 
842 and don't forget to make automatically generated files:
844 @example 
846     autoconf footnote(patches don't include automatically generated files, 
847     i.e. file(configure) and files generated by file(configure).)
849     configure
851 @end example 
852     
854 @bye