]> git.donarmstrong.com Git - lilypond.git/blob - Documentation/user/internals.itely
release: 1.4.2
[lilypond.git] / Documentation / user / internals.itely
1 @c -*-texinfo-*-
2 @c Note:
3 @c
4 @c A menu is needed before every deeper *section nesting of @nodes
5 @c Run M-x texinfo-all-menus-update
6 @c to automagically fill in these menus
7 @c before saving changes
8
9
10 @node Internals
11 @chapter Internals
12
13
14 When translating the input to notation, there are number of distinct
15 phases.  We list them here:
16
17 @table @b
18
19 @item Parsing:
20
21 The LY file is read, and converted to a list of @code{Scores}, which
22 each contain @code{Music} and paper/midi-definitions. Here @code{Music},
23 @code{Pitch} and @code{Duration}  objects are created.
24
25 @item Interpreting music
26 @cindex interpreting music
27
28 All music events are "read" in the same order as they would be played
29 (or read from paper). At every step of the interpretation, musical
30 events are delivered to
31 interpretation contexts,
32 @cindex engraver
33 which use them to build @code{Grob}s (or MIDI objects, for MIDI output).
34
35 In this stage @code{Music_iterators} do a traversal of the @code{Music}
36 structure. The music events thus encountered are reported to
37 @code{Translator}s, a set of objects that collectively form interpretation
38 contexts.
39
40
41 @item Prebreaking
42
43 @cindex prebreaking
44
45 At places where line breaks may occur, clefs and bars are prepared for
46 a possible line break. 
47
48 @item Preprocessing
49
50 @cindex preprocessing
51
52 In this stage, all information that is needed to determine line breaking
53 is computed. 
54
55 @item Break calculation:
56
57 The lines and horizontal positions of the columns are determined.
58
59 @item Breaking
60
61 Relations between all grobs are modified to reflect line breaks: When a
62 spanner, e.g. a slur, crosses a line-break, then the spanner is "broken
63 into pieces", for every line that the spanner is in, a copy of the grob
64 is made. A substitution process redirects all grob-reference so that
65 each spanner grob will only reference other grobs in the same line.
66
67 @item Outputting:
68
69 All vertical dimensions and spanning objects are computed, and all grobs
70 are output, line by line. The output is encoded in the form of
71 @code{Molecule}s
72
73 @end table
74
75 The data types that are mentioned here are all discussed in this
76 section.
77
78 @menu
79 * Input location::              
80 * Moment::                      
81 * Duration::                    
82 * Pitch data type::             
83 * Music::                       
84 * Music_iterator::              
85 * Translator::                  
86 * Grobs::                       Graphical object  
87 * Molecules::                   Molecules are stand-alone descriptions of output
88 * Font metrics::                Font metrics
89 * Miscellaneous Scheme functions::  
90 @end menu
91
92 @ignore
93   Why not use Scheme syntax for the functions below, such as
94   (ly-input-location? obj) and (ly-get-mus-property m sym) ?
95
96   /MB
97 @end ignore
98
99 @node Input location
100 @section Input location
101
102 @c The parser generates
103
104 Input location objects point to a location in the input file. This
105 location is used to generate error messages and to enable the point and
106 click output.
107
108 @defun ly-input-location? obj
109 Type predicate, return true if @var{obj} is an input location.
110 @end defun
111
112
113
114
115 @node Moment
116 @section Moment
117
118 Moment is a rational number. Since GUILE doesn't support them natively,
119 so we created our own rational data type.
120
121 @defun moment? obj
122 Type predicate, return true if @var{obj} is a moment.
123 @end defun
124
125 @defun make-moment num den
126 create the rational number @var{num}/@var{den}. 
127 @end defun
128
129 @node Duration
130 @section Duration
131
132 A duration is a musical duration, i.e. a length of time described by a
133 power of two (whole, half, quarter, etc.) and a number of augmentation
134 dots. 
135
136 @defun make-duration length dotcount
137
138 @var{length} is the negative logarithm (base 2) of the duration:
139 1 is a half note, 2 is a quarter note, 3 is an eighth
140 note, etc.  The number of dots after the note is given by
141 @var{dotcount}.
142 @end defun
143
144
145 @defun duration? obj
146 Type predicate, return true if @var{obj} is a duration.
147 @end defun
148
149 @node Pitch data type
150 @section Pitch data type
151
152
153
154 @defun make-pitch octave note shift
155
156 @var{octave} is specified by an integer, zero for the octave containing
157 middle C.  @var{note} is a number from 0 to 6, with 0 corresponding to C
158 and 6 corresponding to B.  The shift is zero for a natural, negative for
159 flats, or positive for sharps.
160 @end defun
161
162 @defun pitch-octave p 
163 extract the octave from pitch @var{p}.
164 @end defun
165
166 @defun pitch-notename p
167 extract the note name from pitch  @var{p}.
168 @end defun
169
170 @defun pitch-alteration p
171 extract the alteration from pitch  @var{p}.
172 @end defun
173
174 @defun pitch-semitones p
175 calculate the number of semitones of @var{p} from central C.
176 @end defun
177
178 @defun Pitch::transpose t p
179 Transpose @var{p} by the amount @var{t}, where @var{t} is the pitch that
180 central C is transposed to. 
181 @end defun
182
183
184 @node Music
185 @section Music
186
187 Music is the data type that music expressions are stored in. The data
188 type does not yet offer many manipulations.
189
190 @defun ly-get-mus-property m sym
191 Get the property @var{sym} of music expression @var{m}.
192 @end defun
193
194 @defun ly-set-mus-property m sym val
195 Set property @var{sym} in music expression @var{m} to @var{val}.
196 @end defun
197
198 @defun ly-make-music name
199 Make a music object/expression of type @var{name}. Warning: this
200 interface will likely change in the near future.
201 @end defun
202
203 @defun music? obj
204 Type predicate,  return true if @var{obj} is a music object.
205 @end defun
206
207 @defun ly-music-name music
208 Print the name of @var{music}.
209 @end defun
210
211
212 @node Music_iterator
213 @section Music_iterator
214
215 Music_iterator is an object type that traverses the Music structure and
216 reports the events it finds to interpretation contexts. It is not yet
217 user-serviceable.
218
219 @defun c++-function? obj
220 Type predicate, return true if @var{obj} is a  c++-function.
221 Music_iterator are created from schemified C++ constructors. Such a
222 constructor is a @code{c++-function}.
223 @end defun
224
225 @node Translator
226 @section Translator
227
228 Translators are the building blocks of contexts. They are not yet user
229 accessible.
230
231 @defun ly-get-trans-property tr sym
232 retrieve the value of @var{sym} from context @var{tr}
233 @end defun
234
235 @defun ly-set-trans-property tr sym val
236 set value of property @var{sym} in context @var{tr} to @var{val}.
237 @end defun
238
239
240 @node Grobs
241 @section Grobs
242
243 This section is about Grobs (short for Graphical Objects), which are
244 formatting objects used to create the final output. This material is
245 normally the domain of LilyPond gurus, but occasionally, a normal user
246 also has to deal with grobs.
247
248 The most simple interaction with Grobs are when you use
249 @code{\override}:
250
251 @example
252         \property Voice.Stem \override #'direction = #1
253 @end example
254
255 This piece of lily input causes all stem objects to be stem-up
256 henceforth.  In effect, you are telling lilypond to extend the definition
257 of the `Stem' grob with the setting @code{direction := 1}.
258
259 @menu
260 * What is a grob?::             
261 * Callbacks::                   
262 * Setting grob properties::     
263 * Grob interfaces::             
264 * Items and Spanners::          
265 * Grob Scheme functions::       
266 @end menu
267
268
269
270 @node What is a grob?
271 @subsection What is a grob?
272
273 In music notation, lots of symbols are related in some way.  You can
274 think of music notation as a graph where nodes are formed by the
275 symbols, and the arcs by their relations. A grob is a node in that graph.
276 The directed edges in the graph are formed by references to other grobs
277 (i.e. pointers).
278 This big graph of grobs specifies the notation problem. The solution of
279 this problem is a description of the printout in closed form, i.e. a
280 list of values.  These values are Molecules. (see @ref{Molecules})
281
282 All grobs have an X and Y-position on the page.  These X and Y positions
283 are stored in a relative format, so they can easily be combined by
284 stacking them, hanging one grob to the side of another, and coupling
285 them into a grouping-grob.
286
287 Each grob has a reference point (a.k.a.  parent): the position of a grob
288 is stored relative to that reference point. For example the X-reference
289 point of a staccato dot usually is the note head that it applies
290 to. When the note head is moved, the staccato dot moves along
291 automatically.
292
293 If you keep following offset reference points, you will always end up at
294 the root object. This root object is called @code{Line_of_score}, and it
295 represents a system (i.e. a line of music).
296
297 All grobs carry a set of grob-properties.  In the Stem example above,
298 the property @code{direction} is set to value @code{1}.  The function
299 that draws the symbol (@code{Stem::brew_molecule}) uses the value of
300 @code{direction} to determine how to print the stem and the flag.  The
301 appearance of a grob is determined solely by the values of its
302 properties.
303
304 A grob is often associated with a symbol, but some grobs do not print
305 any symbols. They take care of grouping objects. For example, there is a
306 separate grob that stacks staffs vertically. The @code{NoteCollision}
307 is also an abstract grob: it only moves around chords, but doesn't print
308 anything.
309
310 A complete list of grob types is found in the generated documentation.
311
312
313 @node Callbacks
314 @subsection Callbacks
315
316 Offsets of grobs are relative to a parent reference point. Most
317 positions are not known when an object is created, so these are
318 calculated as needed. This is done by adding a callback for a specific
319 direction.
320
321 Suppose you have the following code in a .ly file.
322 @example
323         #(define (my-callback gr axis)
324                 (*  2.0 (get-grob-property gr 'direction))
325         )
326
327 ....
328
329         \property Voice.Stem \override #'Y-offset-callbacks = #(list
330                         my-callback)
331 @end example
332
333 When the Y-offset of a Stem object is needed, LilyPond will
334 automatically execute all callbacks for that object. In this case, it
335 will find @code{my-callback}, and execute that. The result is that the
336 stem is translated by two staff spaces in its direction.
337
338 (note: @code{Y-offset-callbacks} is also a property)
339
340
341
342 Offset callbacks can be stacked, i.e.
343
344 @example
345         \property .... \override #'Y-offset-callbacks = #(list
346                 callback1 callback2 callback3)
347
348 @end example
349
350 The callbacks will be executed in the order @code{callback3 callback2
351 callback1}. This is used for quantized positioning: the staccato dot is
352 above or below a note head, and it must not be on a staff-line.  To
353 achieve this, the staccato dot has two callbacks: one that positions the
354 grob above or below the note head, and one that rounds the Y-position of
355 the grob to the nearest open space.
356
357 Similarly, the size of a grob are determined through callbacks, settable
358 with grob properties @code{X-extent-callback} and
359 @code{Y-extent-callback}.  There can be only one extent-callback for
360 each axis. No callback (Scheme value @code{#f}) means: "empty in this
361 direction". If you fill in a pair of numbers, that pair hard-codes the
362 extent in that coordinate.
363
364
365 @node Setting grob properties
366 @subsection Setting grob properties
367
368 Grob properties are stored as GUILE association lists, with symbols as
369 keys.  In GUILE you can access these using functions described in
370 Section @ref{Grob Scheme functions}.  From C++, grob properties can be
371 accessed using these functions:
372
373 @example
374   SCM  get_grob_property (SCM) const;
375   void set_grob_property (const char * , SCM val);
376   void set_immutable_grob_property (const char * , SCM val);
377   void set_immutable_grob_property (SCM key, SCM val);  
378   void set_grob_property (SCM , SCM val);  
379   void set_grob_pointer (const char*, SCM val);
380   SCM  remove_grob_property (const char* nm);
381 @end example
382
383 All lookup functions identify undefined properties with end-of-list
384 (i.e. @code{'()} in Scheme or @code{SCM_EOL} in C)
385
386 Properties are stored in two ways:
387 @itemize @bullet
388 @item mutable properties.
389 Grob properties that change from object to object. The storage of
390 these are private to a grob. For example pointers to other grobs are
391 always stored in the mutable properties.
392
393 @item immutable properties.
394 Grob properties that are shared across different grobs of the same
395 type. The storage is shared, and hence it is read-only. Typically, this
396 is used to store function callbacks, and default settings. They are
397 initially read from @file{scm/grob-description.scm}.
398 @end itemize
399
400 You can change immutable grob properties with the \override syntax:
401
402 @example
403         \property Voice.Stem \override #'direction = #1
404 @end example
405
406 This will push the entry @code{'(direction . 1)} on the immutable
407 property list for stems, in effect overriding the setting from
408 @file{scm/grob-description.scm}. This can be undone by 
409
410 @example
411         \property Voice.stem \revert #'direction
412 @end example
413
414 There is also a shorthand,
415
416 @example
417         \property Context.GrobType \set #'prop = #VAL
418 @end example
419
420 this does a @code{\revert} followed by a @code{\override}
421
422 You can change mutable properties with \outputproperty. This construct
423 looks like
424
425 @example
426         \context ContextName \outputproperty @var{pred} #@var{sym} = #@var{val}
427 @end example
428
429 In this case, in every grob that satisfies @var{pred}, the grob property
430  @var{sym} is set to @var{val}.  For example
431
432 @example
433         \outputproperty
434                 #(lambda (gr) (string? (ly-get-grob-property gr
435                         'text)))
436                 #'extra-offset = #'(-1.0 . 0.0)
437 @end example
438
439 This shifts all grobs that have a @code{text} property one staff
440 space to the left. This mechanism is rather clumsy to use, but it allows
441 you tweak any setting of any grob.
442
443
444 @node Grob interfaces
445 @unnumberedsubsec Grob interfaces
446
447 Grob properties form a name space where you can set variables per
448 object.  Each object however, may have multiple functions. For example,
449 consider a dynamic symbol, such @code{\ff} (fortissimo). It is printed
450 above or below the staff, it is a dynamic sign, and it is a kind of
451 text.
452
453 To reflect this different functions of a grob, procedures and variables
454 are grouped into so-called interfaces.  The dynamic text for example
455 supports the  following interfaces:
456 @table @code 
457 @item font-interface
458   The glyph is built from characters from a font, hence the
459 @code{font-interface}. For objects supporting @code{font-interface}, you
460 can select alternate fonts by setting @code{font-style},
461 @code{font-point-size}, etc.
462
463 @item dynamic-interface
464   Dynamic interface is not associated with any variable or function in
465 particular, but this makes it possible to distinguish this grob from
466 other similar grobs (like @code{TextScript}), that have no meaning of
467 dynamics.
468
469 @item text-interface
470   This interface is for texts that are to be set using special routines
471 to stack text into lines, using kerning, etc.
472
473 @item general-grob-interface
474   This interface is supported by all grob types.
475 @end table
476
477
478
479 @node Items and Spanners
480 @unnumberedsubsec Items and Spanners
481
482 Grobs can also be distinguished in their role in the horizontal spacing.
483 Many grobs define constraints on the spacing by their sizes. For
484 example, note heads, clefs, stems, and all other symbols with a fixed
485 shape.  These grobs form a subtype called @code{Item}.
486
487 Other grobs have a shape that depends on the horizontal spacing. For
488 example, slur, beam, tie, etc. These grobs form a subtype called
489 @code{Spanner}. All spanners have two span-points (these must be
490 @code{Item}s), one on the left and one on the right. The left bound is
491 also the X-reference point of the spanner.
492
493 Some items need special treatment for line breaking. For example, a
494 clef is normally only printed at the start of a line (i.e. after a line
495 break).  To model this, `breakable' items (clef, key signature, bar lines,
496 etc.) are copied twice. Then we have three versions of each breakable
497 item: one version if there is no line break, one version that is printed
498 before the line break (at the end of a system), one version that is
499 printed after the line break.
500
501 Whether these versions are visible and take up space, is determined by
502 the outcome of the @code{visibility-lambda}. This grob property is a
503 function taking a direction (-1, 0 or 1) as argument. It returns a cons
504 of booleans, signifying whether this grob should be transparent and have
505 no extent.
506
507 @node Grob Scheme functions
508 @unnumberedsubsec Grob Scheme functions
509
510 Grob properties can be manipulated from Scheme. In practice, most
511 manipulations are coded in C++ because of tradition.
512
513 @defun ly-get-grob-property g sym
514   Get the value of a value in grob @var{g} of property @var{sym}. It
515 will return @code{'()} (end-of-list) if @var{g} doesn't have @var{sym} set.
516 @end  defun
517
518 @defun ly-set-grob-property g sym val
519 Set @var{sym} in grob @var{g} to value @var{val}
520 @end defun
521
522 @defun ly-get-spanner-bound spanner dir
523 Get one of the bounds of @var{spanner}. @var{dir} may be @code{-1} for
524 left, and @code{1} for right.
525 @end defun
526
527 @defun ly-grob? g
528 Typecheck: is @var{g} a grob?
529 @end defun
530
531
532
533
534 @node Molecules
535 @section Molecules
536
537 @cindex Molecule
538 @cindex Atom
539 @cindex Output description
540
541 The objective of any typesetting system is to put ink on paper in the
542 right places. For LilyPond, this final stage is left to the @TeX{} and
543 the printer subsystem. For lily, the last stage in processing a score is
544 outputting a description of what to put where.  This description roughly
545 looks like
546
547 @example
548         PUT glyph AT (x,y)
549         PUT glyph AT (x,y)
550         PUT glyph AT (x,y) 
551 @end example
552
553 you merely have to look at the tex output of lily to see this.
554 Internally these instructions are encoded in Molecules.@footnote{At some
555 point LilyPond also contained Atom-objects, but they have been replaced
556 by Scheme expressions, making the name outdated.}  A molecule is
557 what-to-print-where information that also contains dimension information
558 (how large is this glyph?).
559
560 Conceptually, Molecules can be constructed from Scheme code, by
561 translating a Molecule and by combining two molecules. In BNF
562 notation:
563
564 @example
565 Molecule  :: COMBINE Molecule Molecule
566            | TRANSLATE Offset Molecule
567            | GLYPH-DESCRIPTION
568            ;
569 @end example
570
571 If you are interested in seeing how this information is stored, you
572 can run with the @code{-f scm} option. The scheme expressions are then
573 dumped in the output file.
574
575 All visible, i.e. non-transparent, grobs have a callback to create a
576 Molecule. The name of the property is @code{molecule-callback}, and its
577 value should be a Scheme function taking one argument (the grob) and
578 returning a Molecule.  Most molecule callbacks are written in C++, but
579 you can also write them in Scheme. An example is provided in
580 @code{input/regression/molecule-hacking.ly}.
581
582
583 @defun molecule? m
584 type predicate.
585 @end defun
586
587 @defun ly-combine-molecule-at-edge  mol1 axis dir mol2 padding
588 Construct a molecule by putting @var{mol2} next to
589 @var{mol1}. @var{axis} can be 0 (x-axis) or 1 (y-axis), @var{dir} can be
590 -1 (left or down) or 1 (right or up).  @var{padding} specifies extra
591 space to add in between measured in global staff space.
592 @end defun
593
594 @defun ly-get-molecule-extent! mol axis
595 Return a pair of numbers signifying the extent of @var{mol} in
596 @var{axis} direction (0 or 1 for x and y axis respectively).
597 @end defun
598
599 @defun ly-set-molecule-extent! mol axis extent
600 Set the extent (@var{extent} must be a pair of numbers) of @var{mol} in 
601 @var{axis} direction (0 or 1 for x- and y-axis respectively).
602
603 Note that an extent @code{(A . B)} is an interval and hence @code{A} is
604 smaller than @code{B}, and is often negative.
605
606 @end defun
607
608 @node Font metrics
609 @section Font metrics
610
611 The font object represents the metric information of a font. Every font
612 that is loaded into LilyPond can be accessed via Scheme. 
613
614 LilyPond only needs to know the dimension of glyph to be able to process
615 them. This information is stored in font metric files. LilyPond can read
616 two types of font-metrics: @TeX{} Font Metric files (TFM files) and
617 Adobe Font Metric files (AFM files).  LilyPond will always try to load
618 AFM files first since they are more versatile.
619
620 @defun ly-get-default-font gr
621 This returns the default font for grob @var{gr}.
622 @end defun
623
624 @defun ly-find-glyph-by-name font name
625 This function retrieves a Molecule for the glyph named @var{name} in
626 @var{font}.  The font must be available as an AFM file.
627 @cindex afm file
628
629 @end defun
630
631 @node Miscellaneous Scheme functions
632 @section Miscellaneous Scheme functions
633
634  
635 @defun ly-warn msg
636 Scheme callable function to issue the warning @code{msg}.
637 @end defun
638
639 @defun ly-version
640 Return the current lilypond version as a list, e.g.
641 @code{(1 3 127 uu1)}. 
642 @end defun
643
644 @defun ly-gulp-file name
645 Read the file named @var{name}, and return its contents in a string. The
646 file is looked up using the lilypond search path.
647
648 @end defun
649
650 @defun dir?
651 type predicate. A direction is a -1, 0 or 1, where -1 represents left or
652 down and 1 represents right or up.
653 @end defun
654
655 @defun ly-number->string num
656  converts @var{num} to a string without generating many decimals. It
657 leaves a space at the end.
658 @end defun
659
660 @defun set-lily-option sym val
661  Set a global option for the program. Supported options  include
662 @table @code
663 @item midi-debug
664 If set to true, generate human  readable MIDI
665 @end table
666
667 This function is useful to call from the command line: @code{lilypond -e
668 "(set-lily-option 'midi-debug #t)"}
669
670 @end defun