lilypond-essay: Flexible architecture

 
 Flexible architecture
 ---------------------
 
 When we started, we wrote the LilyPond program entirely in the C++
 programming language; the program’s functionality was set in stone by
 the developers.  That proved to be unsatisfactory for a number of
 reasons:
 
    • When LilyPond makes mistakes, users need to override formatting
      decisions.  Therefore, the user must have access to the formatting
      engine.  Hence, rules and settings cannot be fixed by us at
      compile-time but must be accessible for users at run-time.
 
    • Engraving is a matter of visual judgment, and therefore a matter of
      taste.  As knowledgeable as we are, users can disagree with our
      personal decisions.  Therefore, the definitions of typographical
      style must also be accessible to the user.
 
    • Finally, we continually refine the formatting algorithms, so we
      need a flexible approach to rules.  The C++ language forces a
      certain method of grouping rules that cannot readily be applied to
      formatting music notation.
 
    These problems have been addressed by integrating an interpreter for
 the Scheme programming language and rewriting parts of LilyPond in
 Scheme.  The current formatting architecture is built around the notion
 of graphical objects, described by Scheme variables and functions.  This
 architecture encompasses formatting rules, typographical style and
 individual formatting decisions.  The user has direct access to most of
 these controls.
 
    Scheme variables control layout decisions.  For example, many
 graphical objects have a direction variable that encodes the choice
 between up and down (or left and right).  Here you see two chords, with
 accents and arpeggios.  In the first chord, the graphical objects have
 all directions down (or left).  The second chord has all directions up
 (right).
 
      [image src="" alt="[image of music]" text="image of music"]
 
 The process of formatting a score consists of reading and writing the
 variables of graphical objects.  Some variables have a preset value.
 For example, the thickness of many lines – a characteristic of
 typographical style – is a variable with a preset value.  You are free
 to alter this value, giving your score a different typographical
 impression.
 
      [image src="" alt="[image of music]" text="image of music"]
 
    Formatting rules are also preset variables: each object has variables
 containing procedures.  These procedures perform the actual formatting,
 and by substituting different ones, we can change the appearance of
 objects.  In the following example, the rule governing which note head
 objects are used to produce the note head symbol is changed during the
 music fragment.
 
      [image src="" alt="[image of music]" text="image of music"]