From: Han-Wen Nienhuys Date: Sun, 4 Feb 2001 22:57:49 +0000 (+0100) Subject: release: 1.3.128 X-Git-Tag: release/1.3.128 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=16552264e655926b1c54825a2b0f8778be4235fe;p=lilypond.git release: 1.3.128 ============ * Mutopia preparations and Coriolan fixes. * Small beam cleanup, changed y-position-hs,height-hs user overrides to staff-position,height (height:name suggestions?), now in staff-spaces. * Beam (y, dy) calculations now as list of scm functions. * Added cleaned-up excerpt from Coriolan for tutorial. * Bugfix: beam looks at smallest gap for auto knees. * Property-description-fix: allow auto-knee-gap to be set to false. * Small doco fixes. * Bugfix: repeats without alternatives. 1.3.127. --- diff --git a/CHANGES b/CHANGES index b84e4d35aa..fc3f369537 100644 --- a/CHANGES +++ b/CHANGES @@ -1,17 +1,10 @@ -1.3.127.jcn4 -============ - -* Mutopia preparations and Coriolan fixes. - 1.3.127.jcn3 ============ +* Mutopia preparations and Coriolan fixes. * Small beam cleanup, changed y-position-hs,height-hs user overrides to staff-position,height (height:name suggestions?), now in staff-spaces. -1.3.127.jcn2 -============ - * Beam (y, dy) calculations now as list of scm functions. * Added cleaned-up excerpt from Coriolan for tutorial. @@ -20,16 +13,31 @@ * Property-description-fix: allow auto-knee-gap to be set to false. -1.3.127.jcn1 -============ - * Small doco fixes. -* Bugfix: no alternatives. +* Bugfix: repeats without alternatives. -1.3.126.jcn2 +1.3.127.uu3 ============ +* Bugfix: staccato dot on outer staff lines. + +* Documentation: lots of updates and revisions. + +* \repeat tremolo for single notes, \repeat tremolo 4 c16 +produces the same effect as c4:16 + +1.3.126.mb1 +=========== + +* ly2dvi: bugfix --number. +Added header field latexpackages, see input/test/orchestscore.ly + +* \mark: add possibility to use font selection markup, see input/test/mark.ly + +1.3.127 +======= + * Grand Refman restructuring, featuring outline mode. * Fixed missing menus and cross references. diff --git a/Documentation/user/bugs.itexi b/Documentation/user/bugs.itexi index 1b414e2a00..206b56b704 100644 --- a/Documentation/user/bugs.itexi +++ b/Documentation/user/bugs.itexi @@ -19,9 +19,6 @@ verify your problem. @item which LilyPond version you use. Without this, we can not verify your problem. - -This information tells us if you've found a new bug, or an old one. - @item A description of the platform you use (i.e., operating system, system libraries, whether you downloaded a binary release) diff --git a/Documentation/user/convertors.itely b/Documentation/user/convertors.itely index 5d7a052349..92848556d9 100644 --- a/Documentation/user/convertors.itely +++ b/Documentation/user/convertors.itely @@ -8,12 +8,24 @@ Midi2ly translates a MIDI input file to a LilyPond source file. Midi2ly is part of the GNU LilyPond music typesetting package. + +Human players usually are rhythmically not very exact when they record +MIDI files. midi2ly tries to compensate for these errors, but is not +very good at this. It is therefore not recommended to use midi2ly for +human-generated midi files. Correcting the quantization mistakes of the +human player takes a lot of time. + +Hackers who know about signal processing are invited to write a more +robust midi2ly. + @subsection Invoking midi2ly @example midi2ly [options] midi-file @end example +@unnumberedsec Options + @table @code @item -b, --no-quantify, Write exact durations, e.g.: `a4*385/384'. @@ -69,7 +81,7 @@ version information @end table Enigma Transport Format is a format used by Coda Music Technology's -Finale product. This program will convert a subset of ETF to a +Finale product. This program will convert part of an ETF file to a ready-to-use lilypond file. Report bugs to bug-gnu-music@@gnu.org diff --git a/Documentation/user/internals.itely b/Documentation/user/internals.itely index aaf03d8da6..3f37cc89b7 100644 --- a/Documentation/user/internals.itely +++ b/Documentation/user/internals.itely @@ -67,8 +67,11 @@ The lines and horizontal positions of the columns are determined. @item Breaking -Relations between all grobs are modified to reflect line breaks. See -also @ref{Pointer substitution}. +Relations between all grobs are modified to reflect line breaks: When a +spanner, eg. a slur, crosses a line-break, then the spanner is "broken +into pieces", for every line that the spanner is in, a copy of the grob +is made. A substitution process redirects all grob-reference so that +spanner grob will only reference other grobs in the same line. @item Outputting: @@ -117,13 +120,16 @@ how grobs work. * Callbacks:: * Setting grob properties:: * Items and Spanners:: -* Pointer substitution:: * Grob Scheme functions:: @end menu + + @node What is a grob? @subsection What is a grob? +[TODO: document/explain interfaces] + In music notation, lots of symbols are related in some way. You can think of music notation as a graph where nodes are formed by the symbols, and the arcs by their relations. A grob is node in that @@ -147,7 +153,7 @@ to. Whenever the note head is moved, the staccato dot moves along automatically. If you keep following offset reference points, you will always end up at -the root-object. This root object is called @rgrob{Line_of_score}, and it +the root-object. This root object is called @code{Line_of_score}, and it represents a system (ie. a line of music). All grobs carry a set of grob-properties. In the Stem example above, @@ -157,17 +163,17 @@ that draws the symbol (@code{Stem::brew_molecule}) uses the value of appearance of a grob is determined solely by the values of its properties. -Often, a grob also is associated with a symbol. On the other hand, -Some grobs do not print any symbols, but take care of grouping -objects. For example, there is a separate grob that stacks staffs -vertically, so they are not printed in overstrike. The -@rgrob{NoteCollision} is another example of an abstract grob. It only -moves around chords, but doesn't print anything. +Often, a grob also is associated with a symbol. However, some +grobs do not print any symbols, but take care of grouping objects. For +example, there is a separate grob that stacks staffs vertically, so they +are not printed in overstrike. The @code{NoteCollision} is another +example of an abstract grob. It only moves around chords, but doesn't +print anything. -A complete list of grob types is found in +A complete list of grob types is found in @ref{(lilypond-internals)LilyPond backend} -Grobs are created in the "Interpreting music" phase, by things in +Grobs are created in the "Interpreting music" phase, by objects in LilyPond called engravers. In this phase of the translation, a load of grobs are created, and they are linked into a giant network of objects. This network of grobs forms the "specification" of the print @@ -187,7 +193,7 @@ direction. Suppose you have the following code in a .ly file. @example #(define (my-callback gr axis) - (* 2.0 (get-gr-property grob 'direction)) + (* 2.0 (get-grob-property gr 'direction)) ) .... @@ -214,17 +220,17 @@ Offset callbacks can be stacked, ie. The callbacks will be executed in the order callback3 callback2 callback1. This is used for quantized positioning: the staccato dot is -above or below a note head, and it must not be on a staff-line. - -To achieve this, for the staccato there are two callbacks: one callback +above or below a note head, and it must not be on a staff-line. To +achieve this, for the staccato there are two callbacks: one callback that positions the grob above or below the note head, and one callback that rounds the Y-position of the grob to the nearest open space. Similarly, the size of a grob are determined through callbacks, settable -with grob properties @code{X-extent-callback} and @code{Y-extent-callback}. -There can be only one extent-callback for each axis. No callback (value #f) -means: "empty in this direction". If you fill in a pair, that pair -hard-codes the extent in that coordinate. +with grob properties @code{X-extent-callback} and +@code{Y-extent-callback}. There can be only one extent-callback for +each axis. No callback (Scheme value @code{#f}) means: "empty in this +direction". If you fill in a pair of numbers, that pair hard-codes the +extent in that coordinate. @node Setting grob properties @@ -340,15 +346,6 @@ the outcome of the visibility-lambda. This is a function taking a direction (-1, 0 or 1) and returns a cons of booleans, signifying wether this grob should be transparent and have no extent. -@node Pointer substitution -@unnumberedsubsec Pointer substitution - - -Symbols that cross line-breaks (such as slurs) cause some more -complications. When a spanner crosses a line-break, then the spanner is -"broken into pieces", for every line that the spanner is in, a copy of -the grob is made. A substitution process redirects all grob-reference -so that spanner grob will only reference other grobs in the same line. @node Grob Scheme functions @unnumberedsubsec Grob Scheme functions @@ -360,29 +357,34 @@ will return @code{'()} (end-of-list) if @var{g} doesn't have @var{sym} set. @end defun @defun ly-set-grob-property g sym val +Set @var{sym} in grob @var{g} to value @var{val} @end defun @defun ly-get-spanner-bound spanner dir +Get one of the bounds of @var{spanner}. @var{dir} may be @code{-1} for +left, and @code{1} for right. @end defun @defun ly-grob? g +Typecheck: is @var{g} a grob? @end defun @node Duration @section Duration -@menu -@end menu @defun make-duration length dotcount @var{length} is the negative logarithm (base 2) of the duration: 1 is a half note, 2 is a quarter note, 3 is an eighth note, etc. The number of dots after the note is given by @var{dotcount}. - @end defun +@defun duration? d +type predicate for Duration +@end defun + @node Pitch data type @section Pitch data type @@ -396,43 +398,62 @@ corresponding to C and 7 corresponding to B. The shift is zero for a natural, negative to add flats, or positive to add sharps. @end defun -@defun pitch-octave +@defun pitch-octave p +extract the octave from pitch @var{p}. @end defun @defun pitch-notename +extract the note name from pitch @var{p}. @end defun @defun pitch-alteration +extract the alteration from pitch @var{p}. @end defun @defun pitch-semitones +calculate the number of semitones of @var{p} from central C. @end defun -@defun Pitch::transpose +@defun Pitch::transpose t p +Transpose @var{p} by the amount @var{t}, where @var{t} is the pitch that +central C is transposed to. @end defun @node Engraver @section Engraver -@defun ly-get-trans-property +Engravers are building blocks of contexts. They are not yet user accessible. + +@defun ly-get-trans-property tr sym +retrieve the value of @var{sym} from context @var{tr} @end defun -@defun ly-set-trans-property +@defun ly-set-trans-property tr sym val +set value of property @var{sym} in context @var{tr} to @var{val}. @end defun @node Music_iterator @section Music_iterator +This data-type is a direct hook into some C++ constructor functions. It +is not yet user-serviceable. + @defun c++-function? +type predicate for c++-function. @end defun @node Music @section Music -@defun ly-get-mus-property +Music is the data type that music expressions are stored in. The data +type does not yet offer many manipulations. + +@defun ly-get-mus-property m sym +Get the property @var{sym} of music expression @var{m}. @end defun -@defun ly-set-mus-property +@defun ly-set-mus-property m sym val +Set property @var{sym} in music expression @var{m} to @var{val}. @end defun @@ -470,7 +491,7 @@ notation: Molecule = COMBINE Molecule Molecule | TRANSLATE Offset Molecule | GLYPH-DESCRIPTION - ; + ; @end example If you are interested in seeing how this information is stored, you @@ -478,21 +499,32 @@ can run with the @code{-f scm} option. The scheme expressions are then dumped onto the output file. (refer to the C++ code for more details). All visible, -ie. non-transparant, grobs have a callback to create a Molecule. The +i.e. non-transparant, grobs have a callback to create a Molecule. The name of the property is @code{molecule-callback}, and its value should be a Scheme function taking one argument (the grob) and returning a Molecule. +[insert example of write your own.] + @defun molecule? m +type predicate. @end defun @defun ly-combine-molecule-at-edge mol1 axis dir mol2 padding +Construct a molecule by putting @var{mol2} next to +@var{mol1}. @var{axis} can be 0 (x-axis) or 1 (y-axis), @var{dir} can be +-1 (left or down) or 1 (right or up). @var{padding} specifies extra +space to add in between. The unit is global staff space. is the @end defun @defun ly-get-molecule-extent! mol axis +Return a pair of numbers signifying the extent of @var{mol} in +@var{axis} direction (0 or 1 for x and y axis respectively). @end defun @defun ly-set-molecule-extent! mol axis extent +Set the extent (@var{extent} must be a pair of numbers) of @var{mol} in +@var{axis} direction (0 or 1 for x and y axis respectively). @end defun @node Font metrics @@ -502,12 +534,10 @@ The font object represents the metric information of a font. Every font that is loaded into LilyPond can be accessed via Scheme. LilyPond only needs to know the dimension of glyph to be able to process -them. This information is present in font-metric files. LilyPond can +them. This information is stored in font metric files. LilyPond can read two types of font-metrics: @TeX{} Font Metric files (tfm files) and -Adobe Font Metric files (afm files). AFM files are more versatile, and -LilyPond needs those features to typeset musical symbols. So LilyPond -will always try to load afm files first. - +Adobe Font Metric files (@file{.afm} files). LilyPond will always try +to load afm files first since @file{.afm} files are more versatile. @defun ly-get-default-font gr This returns the default font for grob @var{gr}. @@ -524,21 +554,31 @@ This function retrieves a Molecule for the glyph named @var{name} in @section Miscellaneous Scheme functions @defun ly-input-location? +type predicate @end defun - -@defun ly-warn + +@defun ly-warn msg +Scheme callable function to issue the warning @code{msg}. @end defun @defun ly-version +Return the current lilypond version as a list, e.g. +@code{(1 3 127 uu1)}. @end defun -@defun ly-gulp-file +@defun ly-gulp-file name +read file named @var{name}, and return its contents in a string. This +uses the lilypond search path. + @end defun @defun dir? +type predicate. A direction is a -1, 0 or 1. @end defun -@defun ly-number->string +@defun ly-number->string num + converts @var{num} without generating many decimals. It leaves a space +at the end. @end defun diff --git a/Documentation/user/invoking.itexi b/Documentation/user/invoking.itexi index 3883fef5eb..55a3b80406 100644 --- a/Documentation/user/invoking.itexi +++ b/Documentation/user/invoking.itexi @@ -11,7 +11,7 @@ lilypond [OPTION]... [MUDELA-FILE]... @end example -@unnumberedsec Lilypond Command Options +@unnumberedsec Command Options @table @code @item -f,--format= @@ -42,8 +42,8 @@ show all changes needed to convert a file to relative octave syntax. Disallow untrusted @code{\include} directives, in-line Scheme evaluation, backslashes in @TeX{}, code. -@strong{WARNING}: the @code{--safe} option has not been reviewed for -over a year; do not rely on it for automatic invocation (e.g. over the +@strong{WARNING}: the @code{--safe} option has not been reviewed for a +long time; do not rely on it for automatic invocation (e.g. over the web). Volunteers are welcome to do a new audit. @item -T,--no-timestamps diff --git a/Documentation/user/lilypond.tely b/Documentation/user/lilypond.tely index a4c404abf5..78a8c0bb85 100644 --- a/Documentation/user/lilypond.tely +++ b/Documentation/user/lilypond.tely @@ -71,8 +71,9 @@ this and other documentation. * Bug reports:: Where to report bugs. * ly2dvi:: Generating nice output with titles. * convert-ly:: Upgrading input files. -* Conversion tools:: Converting from MIDI input. +* Conversion tools:: Converting from MIDI input. * Internals:: How it all works. +* Literature:: additional reading * Index of internals:(lilypond-internals). Auto generated detailed documentation. * Index:: Unified index. * Function Index:: Function index. diff --git a/Documentation/user/literature.itely b/Documentation/user/literature.itely index 5a8d93041e..86629ec9b1 100644 --- a/Documentation/user/literature.itely +++ b/Documentation/user/literature.itely @@ -3,9 +3,9 @@ If you need to know more about music notation, here are some interesting titles to read -@table @emph +@table @cite @item banter -Harald Banter, Akkord Lexikon. Schott's S\"ohne +Harald Banter, Akkord Lexikon. Schott's S@"{o}hne 1987. Mainz, Germany ISBN 3-7957-2095-8 Comprehensive overview of commonly used chords. Suggests (and uses) a @@ -13,15 +13,6 @@ unification for all different kinds of chord names. -@item ross, -Ted Ross, Teach yourself the art of music engraving and processing. -Hansen House, Miami, Florida 1987 - -This is about engraving, i.e. professional typesetting. It contains -directions on good typesetting, but the sections on reproduction -technicalities, how to use pens and history are interesting. -Especially the section on Music Typewriters is amusing.... - @item gerou96 Tom Gerou and Linda Lusk, Essential Dictionary of Music @@ -31,45 +22,57 @@ A concise, alphabetically ordered list of typesetting and music (notation) issues with a rather simplistic attitude but in most cases "good-enough" answers. +[graag zonder neertrappen.] + @item Stone80 Kurt Stone, Music Notation in the Twentieth Century Norton, New York 1980. -The most important book on notation in recent years. +The most important book on notation in recent years: it describes music +notation for modern serious music, but starts out with a thorough +overview of existing traditional notation practices. + +@item read-notation, +Gardner Read, Music Notation: a Manual of Modern Practice. +Taplinger Publishing, New York (2nd edition). +This is as close to the ``standard'' reference work for music notation +issues as one is likely to get. @item hader48, Karl Hader, Aus der Werkstatt eines Notenstechers. Waldheim--Eberle Verlag, Vienna 1948. - Hader was the chief-engraver of the Waldheim-Eberle music publishers. -This beautiful booklet was intended as an introduction for laymen on -the art of engraving. It contains a step by step, in-depth -explanation of how to cut and stamp music into zinc plates. It also -contains a few compactly formulated rules on musical orthography. Out -of print. +This beautiful booklet was intended as an introduction for laymen on the +art of engraving. It contains a step by step, in-depth explanation of +how to cut and stamp music into zinc plates. It also contains a few +compactly formulated rules on musical orthography. This book is out of +print. + + +@item ross, +Ted Ross, Teach yourself the art of music engraving and processing. +Hansen House, Miami, Florida 1987 + +This book is about engraving, i.e. professional typesetting. It contains +directions on good typesetting, but the sections on reproduction +technicalities, how to use pens and history are interesting. @item wanske, -1988 -Helene Wanske, Musiknotation --- Von der Syntax des Notenstichs zum EDV-gesteuerten Notensatz. -Schott-Verlag, Mainz 1988. -ISBN 3-7957-2886-x +Helene Wanske, Musiknotation --- Von der Syntax des Notenstichs zum +EDV-gesteuerten Notensatz. Schott-Verlag, Mainz 1988. ISBN +3-7957-2886-x I. A very thorough overview of engraving practices of various craftsmen. It includes detailed specs of characters, dimensions etc. II. a thorough overview of a anonymous (by now antiquated) -automated system. EDV Means e(lektronischen) D(aten)v(erarbeitung), -electronic data processing HWN. +automated system. EDV means E(lektronischen) D(aten)v(erarbeitung), +electronic data processing. -@item read-notation, -Gardner Read, Music Notation: a Manual of Modern Practice. -Taplinger Publishing, New York (2nd edition). -This is as close to the ``standard'' - reference work for music notation issues as one is likely to get. @end table diff --git a/Documentation/user/ly2dvi.itexi b/Documentation/user/ly2dvi.itexi index e32f596e38..8b7bddfd71 100644 --- a/Documentation/user/ly2dvi.itexi +++ b/Documentation/user/ly2dvi.itexi @@ -3,7 +3,7 @@ @node ly2dvi @chapter ly2dvi -Ly2dvi is a Python script which creates input file for La@TeX{}, +@file{ly2dvi} is a Python script which creates input file for La@TeX{}, based on information from the output files from LilyPond. The script handles multiple files. If a LilyPond file name is specified LilyPond is run to make an output (@TeX{}) file. @@ -17,8 +17,11 @@ Arne Fagertun name @file{ly2dvi}. @subsection Invoking ly2dvi +@example ly2dvi [options] inputfile[.ly] [....] +@end example +@unnumberedsec Options @table @code @item -D,--debug @@ -67,7 +70,7 @@ Arne Fagertun name @file{ly2dvi}. @end table -@subsection Ly2dvi Features +@subsection Features Ly2dvi responds to several parameters specified in the LilyPond file. They are overridden by corresponding command line options. @@ -85,7 +88,7 @@ file. They are overridden by corresponding command line options. Specify name of papersize. @end table -@subsection Ly2dvi Environment +@subsection Environment @table @code @item LILYPONDPREFIX @@ -96,7 +99,7 @@ file. They are overridden by corresponding command line options. Temporary directory name. Default is /tmp @end table -@subsection Ly2dvi Files +@subsection Files @file{titledefs.tex} is inspected for definitions used to extract additional text definitions from the LilyPond file. In the current @@ -197,7 +200,7 @@ present. Possible value is a valid directory specification that is writable to the user. @end table -@subsection Ly2dvi Initialization Sequence +@subsection Initialization Sequence The initialization process reads inputs for several sources. Below is a list of priorities for lowest to hightest proirity. @@ -213,7 +216,7 @@ a list of priorities for lowest to hightest proirity. @item command line options @end itemize -@subsection Ly2dvi Bugs +@subsection Bugs See @ref{Bug reports}. If you have found a bug, you should send a bugreport. @@ -227,7 +230,7 @@ bugreport. to this mailinglist). @end itemize -@subsection Ly2dvi Remarks +@subsection Remarks Many papersizes are now supported. Information on other sizes (La@TeX{} names, horizontal and vertical sizes) should be mailed to @@ -239,7 +242,7 @@ a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, archA, archB, archC, archD, archE, b0, b1, b2, b3, b4, b5, flsa, flse, halfletter, ledger, legal, letter, note -@subsection Ly2dvi Authors +@subsection Authors Python Version author: @email{daboys@@austin.rr.com, Jeffrey B. Reed}, @uref{http://home.austin.rr.com/jbr/jeff/lilypond/} diff --git a/Documentation/user/macros.itexi b/Documentation/user/macros.itexi index 11e225ff77..b6110ced05 100644 --- a/Documentation/user/macros.itexi +++ b/Documentation/user/macros.itexi @@ -1,8 +1,4 @@ @ifinfo -@macro rgrob {word} -@ref{ (lilypond-internals)\word\, \word\ }, - -@end macro @macro reng {word} @ref{ (lilypond-internals)Engraver \word\, \word\ }, @@ -10,10 +6,6 @@ @end ifinfo @ifnotinfo -@macro rgrob {word} -@ref{ (lilypond-internals)\word\, \word\ } - -@end macro @macro reng {word} @ref{ (lilypond-internals)Engraver \word\, \word\ } diff --git a/Documentation/user/refman.itely b/Documentation/user/refman.itely index dce6226bdd..018f69c997 100644 --- a/Documentation/user/refman.itely +++ b/Documentation/user/refman.itely @@ -12,61 +12,91 @@ fix all FIXMEs Rhythm staff (clef, x-notehead) - Piano pedals - \addlyrics, \autochange, \partcombine: music (re)grouping + \partcombine: -> orchestral part-HOWTO. markup text postscript, scheme output? (links to?) using/existance of ly2dvi, lilypond-book @end ignore -@c.{Reference Manual} +@c .{Reference Manual} @node Reference Manual @chapter Reference Manual + +This document describes GNU LilyPond and its input format. This document +has been revised for LilyPond 1.3.125 + + + @menu * Overview:: * Music constructs:: * Modifying music:: +* Repeats:: * Note entry:: -* Note specification:: * Music notation:: -* Lyrics entry:: -* Chord entry:: +* Polyphony:: +* Spanners:: +* Piano music:: +* Lyrics:: +* Chords:: * Page layout:: * Sound:: * Music entry:: * Engravers:: -* Lexer innards:: +* Syntactic details:: * Unsorted:: @end menu -@c. {Overview} +@c . {Overview} @node Overview @section Overview -This document -describes the the GNU LilyPond input format This format represents a -piece of music in an elegant way, but contains enough information for -both automatic typesetting and automatic performances. - -This document has been revised for LilyPond 1.3.125 - -[todo: ] - -There are two things to note here. The format contains musical -concepts like pitches and durations, instead of symbols and positions: -the input format tries to capture the meaning of @emph{music}, and not -notation. Second, the format tries to be @emph{context-free}: -a note will sound the same regardless of the current time signature, -the key, etc. The purpose of LilyPond is explained informally by the term `music typesetter'. This is not a fully correct name: not only does the program print musical symbols, it also makes esthetic decisions. All -symbols and their placement is @emph{generated} from a high-level musical -description. In other words, LilyPond would be best -described by `music compiler' or `music to notation compiler'. +symbols and their placement is @emph{generated} from a high-level +musical description. In other words, LilyPond would be best described +by `music compiler' or `music to notation compiler'. + +Internally, LilyPond is written in a mixture of Scheme and C++. Most of +the algorithms and low-level routines are written in C++, but these low +level components are glued together using Scheme data +structures. LilyPond is linked to GUILE, GNU's Scheme library for +extension. + +When lilypond is run to typeset sheet music, the following happens: + +@itemize @bullet +@item GUILE Initialization: various scheme files are read +@item parsing: first standard .ly initialization files are read, and +then the user @file{.ly} file is read. +@item interpretation: the music in the file is processed "in playing +order", i.e. in the same order as your eyes scan sheet music, and in the +same order that you hear the notes play. + +@item typesetting: +in this step, the results of the interpretation, a typesetting +specification, is solved. + +@item the visible results ("virtual ink") is written to the output file. +@end itemize + +These stages, involve data of a specific type: during parsing, +@strong{Music} objects are created. During the interpretation, +@strong{context} is constructed, and with this context af network of +@strong{graphical objects} (``grobs'') is created. The grobs contain +unknown variables, and the network forms a set of equations. After +solving the equations and filling in these variables, the printed output +(in the form of @strong{molecules}) is written to an output file. + +These threemanship of tasks (parsing, translating, typesetting) and +data-structures (music, context, graphical objects) permeates the entire +design of the program. This manual is ordered in terms of user +tasks. With each concept will be explained to which of the three parts +it belongs. LilyPond input can be classified into three types: @itemize @bullet @@ -80,32 +110,28 @@ can enter and edit them in manageable chunks. @end itemize -@c. {Music constructs} +@c . {Music constructs} @node Music constructs @section Music constructs @cindex Music constructs @menu * Music expressions:: * Sequential music:: -* Simultanious music:: +* Simultaneous music:: * Compound music expressions:: -* Grace music:: -* Explicit atomic music:: @end menu -@c. {Music expressions} +@c . {Music expressions} @node Music expressions @subsection Music expressions @cindex music expressions -Music in LilyPond is entered as a music expression. Notes, rests, -lyric syllables are music expressions (the atomic -expressions), -@cindex atomic music expressions -and you can combine music expressions to form new ones. This example -forms a compound expressions out of the quarter @code{c} note and a -@code{d} note: +Music in LilyPond is entered as a music expression. Notes, rests, lyric +syllables are music expressions (the atomic expressions), and you can +combine music expressions to form new ones. This example forms a +compound expressions out of the quarter @code{c} note and a @code{d} +note: @example \sequential @{ c4 d4 @} @@ -115,12 +141,7 @@ The meaning of this compound expression is to play the @code{c} first, and then the @code{d} (as opposed to playing them simultaneously, for instance). -Atomic music expression are discussed in -subsection @ref{Atomic music expressions}. Compound music expressions are -discussed in subsection @ref{Compound music expressions}. - - -@c. {Sequential music} +@c . {Sequential music} @node Sequential music @subsection Sequential music @cindex Sequential music @@ -143,10 +164,10 @@ There is a shorthand, which leaves out the keyword: @code{@{} @var{musicexprlist} @code{@}} @end example -@c. {Simultanious music} -@node Simultanious music -@subsection Simultanious music -@cindex Simultanious music +@c . {Simultaneous music} +@node Simultaneous music +@subsection Simultaneous music +@cindex Simultaneous music @cindex @code{\simultaneous} @example @@ -187,7 +208,7 @@ a Voice context: } @end lilypond -@c. {Compound music expressions} +@c . {Compound music expressions} @node Compound music expressions @subsection Compound music expressions @@ -217,98 +238,7 @@ If the context does not exist, it will be created. The new context can optionally be given a name. -@c. {Grace music} <-> Grace notes -@node Grace music -@subsection Grace music -@cindex Grace music -@cindex @code{\grace} -@cindex ornaments -@cindex grace notes -@cindex @code{graceAlignPosition} - -@example - \grace @var{musicexpr} -@end example - -A grace note expression has duration 0; the next real note is -assumed to be the main note. - -You cannot have the grace note after the main note, in terms of -duration, and main notes, but you can typeset the grace notes to the -right of the main note using the property -@code{graceAlignPosition}. -@cindex @code{flagStyle} - -When grace music is interpreted, a score-within-a-score is set up: -@var{musicexpr} has its own time bookkeeping, and you could (for -example) have a separate time signature within grace notes. While in -this score-within-a-score, you can create notes, beams, slurs, etc. -Unbeamed eighth notes and shorter by default have a slash through the -stem. This behavior can be controlled with the -@code{flagStyle} property. - -@quotation -@lilypond[fragment,verbatim] -\relative c'' { - \grace c8 c4 \grace { [c16 c16] } c4 - \grace { \property Grace.flagStyle = "" c16 } c4 -} - -@end lilypond -@end quotation -@cindex @code{\grace} - -At present, nesting @code{\grace} notes is not supported. The following -may cause run-time errors: -@example - @code{\grace @{ \grace c32 c16 @} c4} -@end example -Since the meaning of such a construct is unclear, we don't consider -this a loss. Similarly, juxtaposing two @code{\grace} sections is -syntactically valid, but makes no sense and may cause runtime errors. - -Ending a staff or score with grace notes may also generate a run-time -error, since there will be no main note to attach the grace notes to. - -The present implementation is not robust and generally kludgy. We expect -it to change after LilyPond 1.4 - - -@c. {Explicit atomic music} -@node Explicit atomic music -@subsection Explicit atomic music -@cindex Explicit atomic music - - -@cindex pitch - -The syntax for pitch specification is - -@cindex @code{\pitch} -@example - \pitch @var{scmpitch} -@end example - -@var{scmpitch} is a pitch scheme object, see @ref{Pitch}. - -In Note and Chord mode, pitches may be designated by names. See -section @ref{Other languages} for pitch names in different languages. - -@cindex duration -@cindex @code{\duration} - -The syntax for duration specification is -@example - \duration @var{scmduration} -@end example - -In Note, Chord, and Lyrics mode, durations may be designated by -numbers and dots. - - - - -@c. {Modifying music} +@c . {Modifying music} @node Modifying music @section Modifying music @cindex Modifying music @@ -320,83 +250,10 @@ Repeated music? Repeating music expressions? @menu -* Relative:: * Transpose:: -* Repeat:: -* Times :: * Apply:: -* Transform:: @end menu - -@c. {Relative} -@node Relative -@subsection Relative -@cindex Relative -@cindex relative octave specification - -It is easy to get confused by octave changing marks and accidentally -putting a pitch in the wrong octave. A much better way of entering a -note's octave is `the relative octave' mode. - -@cindex @code{\relative} -@example - \relative @var{startpitch} @var{musicexpr} -@end example - -The octave of notes that appear in @var{musicexpr} are calculated as -follows: If no octave changing marks are used, the basic interval -between this and the last note is always taken to be a fourth or -less.@footnote{The interval is determined without regarding -accidentals. A @code{fisis} following a @code{ceses} will be put above -the @code{ceses}.} The octave changing marks @code{'} and @code{,} -can then be added to raise or lower the pitch by an extra octave. -Upon entering relative mode, an absolute starting pitch must be -specified that will act as the predecessor of the first note of -@var{musicexpr}. - -Entering scales is straightforward in relative mode. - -@lilypond[fragment,verbatim,center] - \relative c' { - c d e f g a b c c, - } -@end lilypond - -And octave changing marks are used for intervals greater than a fourth. - -@lilypond[fragment,verbatim,center] - \relative c'' { - c g c f, c' a, e'' } -@end lilypond - -If the preceding item is a chord, the first note of the chord is used -to determine the first note of the next chord. But other notes -within the second chord are determined by looking at the immediately -preceding note. - -@lilypond[fragment,verbatim,center] - \relative c' { - c - - - } -@end lilypond -@cindex @code{\notes} - -The pitch after the @code{\relative} contains a notename. To parse -the pitch as a notename, you have to be in note mode, so there must -be a surrounding @code{\notes} keyword (which is not -shown here). - -The relative conversion will not affect @code{\transpose} or -@code{\relative} sections in its argument. If you want to use -relative within transposed music, you must place an additional -@code{\relative} inside the @code{\transpose}. - -It is strongly recommended to use relative pitch mode: less work, -less error-prone, and more readable. - -@c. {Transpose} +@c . {Transpose} @node Transpose @subsection Transpose @cindex Transpose @@ -434,15 +291,47 @@ If you want to use both @code{\transpose} and @code{\relative}, then you must use @code{\transpose} first. @code{\relative} will have no effect music that appears inside a @code{\transpose}. -@c. {Repeat} -@node Repeat -@subsection Repeat -@cindex Repeat -@cindex repeats +@c . {Apply} +@node Apply +@subsection Apply +@cindex Apply +Apply allows a Scheme-function to operate directly on the internal +representation of music. +@example + \apply #@var{func} @var{music} +@end example +The function takes two arguments, being a function and an musical +argument for that function. The function should return a music +expression. + +This example replaces the text string of a script. It also shows a dump +of the music it processes. +@lilypond[verbatim] +#(define (testfunc x) + (if (equal? (ly-get-mus-property x 'text) "foo") + (ly-set-mus-property x 'text "bar")) + ;; recurse + (ly-set-mus-property x 'elements + (map testfunc (ly-get-mus-property x 'elements))) + (display x) + x +) +\score { \notes + \apply #testfunc { c4_"foo" } +} +@end lilypond + +For more information on what is possible, see the @ref{Tricks} and the +automatically generated documentation. + + -@ref{Volta} -[TODO: document #'repeatCommands.] +@c . {Repeat} +@node Repeats +@section Repeats + +@cindex repeats @cindex @code{\repeat} In order to specify repeats, use the @code{\repeat} @@ -466,6 +355,16 @@ practical for anything right now. Make tremolo beams. @end table +@menu +* Repeat syntax:: +* Manual repeat commands:: +* Tremolo repeats:: +* Tremolo subdivision:: +@end menu + +@node Repeat syntax +@subsection Repeat syntax + The syntax for repeats is @example @@ -491,7 +390,6 @@ Normal notation repeats are used like this: c'1 \repeat volta 2 { c'4 d' e' f' } \repeat volta 2 { f' e' d' c' } - @end lilypond @end quotation @@ -503,14 +401,13 @@ With alternative endings: c'1 \repeat volta 2 {c'4 d' e' f'} \alternative { {d'2 d'} {f' f} } - @end lilypond @end quotation Folded repeats look like this:@footnote{Folded repeats offer little more over simultaneous music. However, it is to be expected that more functionality -- especially for the MIDI backend -- will be -implemented.} +implemented at some point in the future.} @quotation @@ -522,19 +419,6 @@ implemented.} @end lilypond @end quotation -@quotation - -@lilypond[fragment,verbatim] -\context Staff { - \relative c' { - \partial 4; - \repeat volta 2 { e | c2 d2 | e2 f2 | } - \alternative { { g4 g g } { a | a a a a | b1 } } - } -} - -@end lilypond -@end quotation If you don't give enough alternatives for all of the repeats, then the first alternative is assumed to be repeated often enough to equal @@ -544,123 +428,110 @@ the specified number of repeats. @lilypond[fragment,verbatim] \context Staff { \relative c' { - \repeat volta 3 { \partial 4; e | c2 d2 | e2 f2 | } - \alternative { { g4 g g } - {\partial 1; e4 e e } - {\partial 1; a a a a | b1 } } + \partial 4; + \repeat volta 3 { e | c2 d2 | e2 f2 | } + \alternative { { g4 g g } { a | a a a a | b2. } } } } + @end lilypond @end quotation + As you can see, LilyPond doesn't remember the timing information, nor -are slurs or ties repeated. We hope to fix this after 1.4. +are slurs or ties repeated. We hope to fix this after 1.4. -It is possible to nest @code{\repeat}. This is not entirely -supported: the notes will come be in the right places, but the repeat -bars will not. +It is possible to nest @code{\repeat}, although it probably is only +meaningful for nested repeats. -To place tremolo marks between notes, use @code{\repeat} with tremolo -style. +@node Manual repeat commands +@subsection Manual repeat commands + +@cindex @code{repeatCommands} + +The property @code{repeatCommands} can be used to control the layout of +repeats. Its value is a Scheme list of repeat commands, where each repeat +command can be + +@table @code +@item 'start-repeat + Print a |: bar line +@item 'stop-repeat + Print a :| bar line +@item (volta . #f) +@item (volta . @var{text}) + Print a volta bracket saying @var{text}. +@end table + +@lilypond[verbatim, fragment] + c''4 + \property Score.repeatCommands = #'((volta "93") end-repeat) + c4 c4 + \property Score.repeatCommands = #'((volta #f)) + c4 c4 +@end lilypond + + +@node Tremolo repeats +@subsection Tremolo repeats @cindex tremolo beams -To create tremolo beams on a single note, simply attach -`@code{:}@var{length}' to the note itself. +To place tremolo marks between notes, use @code{\repeat} with tremolo +style. @lilypond[verbatim,center] \score { \context Voice \notes\relative c' { \repeat "tremolo" 8 { c16 d16 } \repeat "tremolo" 4 { c16 d16 } - \repeat "tremolo" 2 { c16 d16 } + \repeat "tremolo" 2 { c16 d16 } + \repeat "tremolo" 4 c16 } \paper { linewidth = 40*\staffspace; } } @end lilypond -@cindex @code{__} -@lilypond[fragment,verbatim,center] +@node Tremolo subdivision +@subsection Tremolo subdivision +@cindex tremolo marks +@cindex @code{tremoloFlags} - c'4:32 +Tremolo marks can be printed on a single note by adding +`@code{:}[@var{length}]' after the note. The length must be at least 8. +A @var{length} value of 8 gives one line across the note stem. If the +length is omitted, then the last value is used, or the value of the +@code{tremoloFlags} property if there was no last value. + +@lilypond[verbatim,fragment,center] + c'2:8 c':32 @end lilypond -@c. {Times} -@node Times -@subsection Times -@cindex Times -@ref{Tuplets} -Tuplets are made out of a music expression by multiplying their -duration with a fraction. +Tremolos in this style do not carry over into the MIDI output. -@cindex @code{\times} -@example - \times @var{fraction} @var{musicexpr} -@end example +Using this mechanism pays off when you entering many tremolos, since the +default argument saves a lot of typing. -The duration of @var{musicexpr} will be multiplied by the fraction. -In print, the fraction's denominator will be printed over the notes, -optionally with a bracket. The most common tuplet is the triplet in -which 3 notes have the length of 2, so the notes are 2/3 of -their written length: -@lilypond[fragment,verbatim,center] - g'4 \times 2/3 {c'4 c' c'} d'4 d'4 -@end lilypond +@c . {Note entry} +@node Note entry +@section Note entry +@cindex Note entry +@menu +* Notes mode:: +* Pitches:: +* Defining pitch names:: +* Durations:: +* Notes:: +* Rests:: +* Multi measure rests:: +* Skip:: +@end menu -@c. {Apply} -@node Apply -@subsection Apply -@cindex Apply -Apply allows a Scheme-function to operate directly on the internal -representation of music. -@example - \apply #@var{func} @var{music} -@end example -The function takes two arguments, being a function and an musical -argument for that function. The function should return a music -expression. - -This example replaces the text string of a script. It also shows a dump -of the music it processes. -@lilypond[verbatim] -#(define (testfunc x) - (if (eq? (ly-get-mus-property x 'text) "foo") - (ly-set-mus-property x 'text "bar")) - ;; recurse - (ly-set-mus-property x 'elements - (map testfunc (ly-get-mus-property x 'elements))) - (display x) - x -) -\score { \notes - \apply #testfunc { c4_"foo" } -} -@end lilypond - -For more information on what is possible, see the @ref{Tricks} and the -automatically generated documentation. - -@c. {Transform} -@node Transform -@subsection Transform -@cindex Transform - - -@c. {Note entry} -@node Note entry -@section Note entry -@cindex Note entry - -@menu -* Notes mode:: -* Pitch names:: -@end menu - -@c. {Notes mode} -@node Notes mode -@subsection Notes mode +@c . {Notes mode} +@node Notes mode +@subsection Notes mode @cindex note mode @@ -674,33 +545,30 @@ notename is found, then @code{word} is treated as a string. Since combinations of numbers and dots are used for indicating durations, it is not possible to enter real numbers in this mode. - @cindex Notes mode -@c. {Pitch names} -@node Pitch names -@subsection Pitch names +@c . {Pitches} +@node Pitches +@subsection Pitches + @cindex Pitch names -@node Note specification -@section Note specification @cindex Note specification - @cindex pitches @cindex entering notes -A note specification has the form +The verbose syntax for pitch specification is +@cindex @code{\pitch} @example - @var{pitch}[@var{octavespec}][!][?][@var{duration}] + \pitch @var{scmpitch} @end example -The pitch of the note is specified by the note's name. - +@var{scmpitch} is a pitch scheme object, see @ref{Pitch data type}. -The default names are the Dutch note names. The notes are specified -by the letters @code{c} through @code{b}, where @code{c} is an -octave below middle C and the letters span the octave above that C. -In Dutch, +In Note and Chord mode, pitches may be designated by names. The default +names are the Dutch note names. The notes are specified by the letters +@code{c} through @code{b}, where @code{c} is an octave below middle C +and the letters span the octave above that C. In Dutch, @cindex note names, Dutch a sharp is formed by adding @code{-is} to the end of a pitch name. A flat is formed by adding @code{-es}. Double sharps and double flats are @@ -723,12 +591,10 @@ svenska.ly c d e f g a b h -iss -ess italiano.ly do re mi fa sol la sib si -d -b catalan.ly do re mi fa sol la sib si -d/-s -b @end example + @cindex @code{'} @cindex @code{,} -Pitch names can be redefined using the @code{\pitchnames} command, see -@ref{Pitch names}. - @@ -757,48 +623,46 @@ octave; each @code{,} lowers the pitch by an octave. ceses' eses' geses' ases' beses' @end lilypond -LilyPond will determine what accidentals to typeset depending on the key -and context, so alteration refer to what note is heard, not to whether -accidentals are printed. A reminder accidental -@cindex reminder accidental -@cindex @code{?} -can be forced by adding an exclamation mark @code{!} after the pitch. -A cautionary accidental, -@cindex cautionary accidental - -i.e., an accidental within parentheses can be obtained by adding the -question mark `@code{?}' after the pitch. -@lilypond[fragment,verbatim,center] - cis' d' e' cis' c'? d' e' c'! -@end lilypond +@c . {Defining pitch names} +@node Defining pitch names +@subsection Defining pitch names +@cindex defining pitch names +@cindex pitch names, defining -@c. {Rests} -@menu -* Rests:: -* Durations:: -* Multi measure rests:: -* Skip:: -@end menu +Note names and chord modifiers can be customised for nationalities. The +syntax is as follows. -@node Rests -@subsection Rests -@cindex Rests +@cindex @code{\pitchnames} +@cindex @code{\chordmodifiers} +@example + \pitchnames @var{scheme-alist} + \chordmodifiers @var{scheme-alist} +@end example -Rests are entered like notes, with note name `@code{r}'. -There is also a note name -`@code{s}', which produces a space of the specified -duration. +See @file{ly/nederlands.ly} and @file{ly/chord-modifiers.ly} for +specific examples how to do this. Some national note names have been +provided, among others: Norwegian, Swedish, German, Italian, Catalan, +French, Dutch and English. -@c. {Durations} +@c . {Durations} @node Durations @subsection Durations -@cindex Durations -Durations are entered as their reciprocal values. For notes longer -than a whole note, use identifiers. + +@cindex duration +@cindex @code{\duration} + +The syntax for an verbose duration specification is +@example + \duration @var{scmduration} +@end example + +In Note, Chord, and Lyrics mode, durations may be designated by numbers +and dots: durations are entered as their reciprocal values. For notes +longer than a whole note, use identifiers. @quotation @@ -834,15 +698,11 @@ r1 r2 r4 r8 r16 r32 r64 r64 As you can see, the longa is not printed. To get a longa note head, you have to use a different style of note heads. See [TODO]. -@cindex @code{.} - - If the duration is omitted then it is set equal to the previous duration entered. At the start of parsing there is no previous duration, so then a quarter note is assumed. The duration can be followed by a dot (`@code{.}') to obtain dotted note lengths. - - +@cindex @code{.} @lilypond[fragment,verbatim,center] a'4. b'4. @@ -853,28 +713,73 @@ a quarter note is assumed. The duration can be followed by a dot You can alter the length of duration by writing `@code{*}@var{fraction}' after it. This will not affect the appearance of note heads or rests. -@c. {Multi measure rests} +@c . {Notes} +@node Notes +@subsection Notes + +A note specification has the form + +@example + @var{pitch}[@var{octavespec}][!][?][@var{duration}] +@end example + + +LilyPond will determine what accidentals to typeset depending on the key +and context, so alteration refer to what note is heard, not to whether +accidentals are printed. A reminder accidental +@cindex reminder accidental +@cindex @code{?} +can be forced by adding an exclamation mark @code{!} after the pitch. +A cautionary accidental, +@cindex cautionary accidental + +i.e., an accidental within parentheses can be obtained by adding the +question mark `@code{?}' after the pitch. + +@lilypond[fragment,verbatim,center] + cis' d' e' cis' c'? d' e' c'! +@end lilypond + + + + +@c . {Rests} +@node Rests +@subsection Rests +@cindex Rests + +Rests are entered like notes, with note name `@code{r}'. +There is also a note name +`@code{s}', which produces a space of the specified +duration. + + +@c . {Multi measure rests} @node Multi measure rests @subsection Multi measure rests @cindex Multi measure rests @cindex @code{R} -Multi_measure_rest are entered using `@code{R}'. It is specifically +[todo: moveme to orchestral-part section?] + +Multi measure rests are entered using `@code{R}'. It is specifically meant for entering parts: the rest can expand to fill a score with rests, or it can be printed as a single multimeasure rest This expansion is controlled by the property @code{Score.skipBars}. If this is set to true, -Lily will not expand empty measures, and the multimeasure rests -automatically adds the appropriate number. +Lily will not expand empty measures, and the appropriate number is added +automatically. -@lilypond[fragment] +@lilypond[fragment,verbatim] \time 3/4; R2.*2 \property Score.skipBars = ##t R2.*17 R2.*4 @end lilypond -Note that there is currently no way to condense multiple rests into a -single multimeasure rest. +Currently, there is no way to condense multiple rests into a single +multimeasure rest. + +@cindex condensing rests -@c. {Skip} +@c . {Skip} @node Skip @subsection Skip @cindex Skip @@ -892,22 +797,16 @@ this has the same effect as the spacer rest. - - -@c. {Music notation} +@c . {Music notation} @node Music notation @section Music notation @cindex Music notation @menu * Key:: -* Clef:: * Time signature:: -* Spanners:: -* Ornaments:: -* Bar check:: @end menu -@c. {Key} +@c . {Key} @node Key @subsection Key @cindex Key @@ -939,13 +838,7 @@ major key, e.g., @code{\minor} is defined as 3. The standard mode names @code{\lydian}, @code{\phrygian}, and @code{\dorian} are also defined. -@c. {Clef} -@node Clef -@subsection Clef -@cindex Clef - - -@c. {Clef changes} +@c . {Clef changes} @subsubsection Clef changes @cindex @code{\clef} @example @@ -955,9 +848,9 @@ major key, e.g., @code{\minor} is defined as 3. The standard mode names Short-cut for @example - \property Clef.clefGlyph = @var{symbol associated with clefname} - \property Clef.clefPosition = @var{clef Y-position for clefname} - \property Clef.clefOctavation = @var{extra pitch of clefname} + \property Staff.clefGlyph = @var{symbol associated with clefname} + \property Staff.clefPosition = @var{clef Y-position for clefname} + \property Staff.clefOctavation = @var{extra pitch of clefname} @end example Supported clef-names include @@ -965,7 +858,7 @@ Supported clef-names include [todo] -@c. {Time signature} +@c . {Time signature} @node Time signature @subsection Time signature @cindex Time signature @@ -984,7 +877,7 @@ A short-cut for doing See the documentation of @code{timeSignatureFraction} -@c. {Partial} +@c . {Partial} @subsubsection Partial @cindex Partial @cindex anacrusis @@ -1007,43 +900,79 @@ Short cut for See the documentation of @code{measurePosition}. +@c . {Polyphony} +@node Polyphony +@section Polyphony +@cindex Polyphony + +[todo : collisiosn, rest-collisinos, voiceX identifiers, how to +which contexts to instantiate.] + + +@table @code +@cindex @code{\shiftOff} + @item @code{\shiftOff} + Disable horizontal shifting of note heads that collide. + +@cindex @code{\shiftOn} + @item @code{\shiftOn} + Enable note heads that collide with other note heads to be + shifted horiztonally. Also @code{\shiftOnn} and @code{\shiftOnnn} +set different shift values. + +@cindex @code{\stemBoth} + @item @code{\stemBoth} + Allow stems, beams, and slurs to point either upwards or + downwards, decided automatically by LilyPond. + +@cindex @code{\stemDown} + @item @code{\stemDown} + Force stems, beams, and slurs to point down. + +@cindex @code{\stemUp} + @item @code{\stemUp} + Force stems, beams and slurs to point up. +@end table -@c. {Spanners} +@c . {Spanners} @node Spanners -@subsection Spanners +@section Spanners @cindex Spanners @menu * Beam:: -* Slur:: -* Tie:: -* Tuplet:: -* Volta:: -* Crescendo and Decrescendo:: -* Text spanner:: -* Ottava:: -* Span requests:: +* Slur :: +* Ornaments:: +* Grace notes:: +* Bar check:: @end menu -@c. {Beam} + + +@c . {Beam} @node Beam -@subsubsection Beam -@cindex Beam +@subsection Beams + +@cindex beams + +@c . {Automatic beams} +@subsubsection Automatic beams -@c. {Automatic beams} -@unnumberedsubsubsec Automatic beams @cindex automatic beam generation @cindex autobeam - @cindex @code{Voice.noAutoBeaming} LilyPond will group flagged notes and generate beams autmatically, where -appropriate. This feature can be disabled by setting the -@code{Voice.noAutoBeaming} property to true, which you may find -necessary for the melody that goes with lyrics, eg. Automatic beaming -can easily be overridden for specific cases by specifying explicit -beams, see @ref{Manual beams}. +appropriate. + +This feature can be disabled by setting the @code{Voice.noAutoBeaming} +property to true, which you may find necessary for the melody that goes +with lyrics, eg. Automatic beaming can easily be overridden for +specific cases by specifying explicit beams. This is discussed in the +next subsubsection. + + @cindex @code{Voice.autoBeamSettings} @cindex @code{(end * * * *)} @@ -1083,45 +1012,65 @@ you would use @code{(end * * 1 32)}. -@c. {Manual beams} +@c . {Manual beams} @cindex Automatic beams -@unnumberedsubsubsec Manual beams +@subsubsection Manual beams @cindex beams, manual @cindex @code{]} @cindex @code{[} -For most situations, beaming can be generated automatically; see section -@ref{Automatic Beaming}. In certain cases it may be necessary to -override the automatic beaming decisions that LilyPond makes. You can -do this by specifying beams explicitely. +In some cases it may be necessary to override LilyPond's automatic +beaming algorithm. For example, the auto beamer will not beam over +rests or bar lines, so if you want that, specify the begin and end point +manually using @code{[} and @code{]}: + +@quotation +@lilypond[fragment,relative,verbatim] + \context Staff { + r4 [r8 g'' a r8] r8 [g | a] r8 + } +@end lilypond + -A manual beam is specified by surrounding the notes that should make up -the beam, with brackets `@code{[}' and `@code{]}'. +@cindex @code{stemLeftBeamCount} -FIXME: example. (or tell: why would the auto-beamer fail here?) +If you have specific wishes for the number of beams, you can fully +control the number of beams through the properties +y@code{Voice.stemLeftBeamCount} and @code{Voice.stemRightBeamCount}. -@lilypond[fragment,verbatim,center] - [a'8 a'] [a'16 a' a' a'] - [a'16 c'' ] - \times 2/3 { [e'8 f' g'] } +@lilypond[fragment,relative,verbatim] + \context Staff { + [f'8 r16 f g a] + [f8 r16 \property Voice.stemLeftBeamCount = #1 f g a] + } @end lilypond +@end quotation +@cindex @code{stemRightBeamCount} - -@c. {Adjusting beams} +@c . {Adjusting beams} @unnumberedsubsubsec Adjusting beams @cindex Adjusting beams FIXME -@c. {Slur} -@node Slur -@subsubsection Slur -@cindex Slur + +@c . {Slur} +@node Slur +@subsection Slur @cindex slur +@menu +* Slur attachments:: +* Tie:: +* Tuplets:: +* Text spanner:: +* Ottava:: +* Span requests:: +@end menu + Slurs connects chords and try to avoid crossing stems. A slur is started with @code{(} and stopped with @code{)}. The starting @code{(} appears to the right of the first note in @@ -1133,12 +1082,102 @@ slurs from both sides: f'()g'()a' [a'8 b'(] a'4 g'2 )f'4 @end lilypond +@c . {Adjusting slurs} +@unnumberedsubsubsec Adjusting slurs + +@node Slur attachments +@subsubsection Slur attachments + +The ending of a slur should whenever possible be attached to a note +head. Only in some instances where beams are involved, LilyPond may +attach a slur to a stem end. In some cases, you may want to override +LilyPond's decision, e.g., to attach the slur to the stem end. This can +be done through @code{Voice.Slur}'s grob-property @code{attachment}: + + +@quotation +@lilypond[fragment,relative,verbatim] + \property Voice.Slur \set #'direction = #1 + \property Voice.Stem \set #'length = #5.5 + g''8(g)g4 + \property Voice.Slur \set #'attachment = #'(stem . stem) + g8(g)g4 +@end lilypond +@end quotation + +Similarly, slurs can be attached to note heads even when beams are +involved: + +@quotation +@lilypond[fragment,relative,verbatim] + \property Voice.Slur \set #'direction = #1 + \property Voice.Slur \set #'attachment = #'(head . head) + g''16()g()g()g()d'()d()d()d +@end lilypond +@end quotation + +If a slur would strike through a stem or beam, LilyPond will move the +slur away vertically (upward or downward). In some cases, this may +cause ugly slurs that you may want to correct: + +@quotation +@lilypond[fragment,relative,verbatim] + \property Voice.Stem \set #'direction = #1 + \property Voice.Slur \set #'direction = #1 + d'32( d'4 )d8.. + \property Voice.Slur \set #'attachment = #'(stem . stem) + d,32( d'4 )d8.. +@end lilypond +@end quotation + +LilyPond will increase the curvature of a slur trying to stay free of +note heads and stems. However, if the curvature would increase too much, +the slur will be reverted to its default shape. This decision is based +on @code{Voice.Slur}'s grob-property @code{beautiful} value. In some +cases, you may find ugly slurs beautiful, and tell LilyPond so by +increasing the @code{beautiful} value: + +[hoe gedefd?? wat betekent beautiful = X?] + +@quotation +@lilypond[verbatim] +\score { + \notes \context PianoStaff < + \time 6/4; + \context Staff=up { s1 * 6/4 } + \context Staff=down < + \clef bass; + \autochange Staff \context Voice + \notes \relative c { + d,8( a' d f a d f d a f d )a + } + > + > + \paper { + linewidth = -1.; + \translator { + \VoiceContext + Slur \override #'beautiful = #5.0 + Slur \override #'direction = #1 + Stem \override #'direction = #-1 + autoBeamSettings \override #'(end * * * *) + = #(make-moment 1 2) + } + \translator { + \PianoStaffContext + VerticalAlignment \override #'threshold = #'(5 . 5) + } + } +} +@end lilypond +@end quotation -@c. {Adjusting slurs} -@unnumberedsubsubsec Adjusting slurs -@c. {Tie} @cindex Adusting slurs + + + +@c . {Tie} @node Tie @subsubsection Tie @@ -1159,80 +1198,47 @@ warning message will appear and no ties will be created. [sparseTies] -@c. {Tuplet} -@node Tuplet -@subsubsection Tuplet -@cindex Tuplet +@c . {Tuplets} +@node Tuplets +@subsubsection Tuplets +@cindex Tuplets +@cindex Times -A @rgrob{TupletBracket} is typeset automatically for music that -is time scaled, see @ref{Times}. +Tuplets are made out of a music expression by multiplying their duration +with a fraction. +@cindex @code{\times} +@example + \times @var{fraction} @var{musicexpr} +@end example -See @ref{Times}. +The duration of @var{musicexpr} will be multiplied by the fraction. +In print, the fraction's denominator will be printed over the notes, +optionally with a bracket. The most common tuplet is the triplet in +which 3 notes have the length of 2, so the notes are 2/3 of +their written length: -@c. {Volta} -@node Volta -@subsubsection Volta -@cindex Volta +@lilypond[fragment,verbatim,center] + g'4 \times 2/3 {c'4 c' c'} d'4 d'4 +@end lilypond -A @rgrob{VoltaBracket} is typeset automatically for music that contains a -repetition, see @ref{Repeat}. +[todo: document tupletSpannerDuration] -@c. {Crescendo and Decrescendo} -@node Crescendo and Decrescendo -@subsubsection Crescendo and Decrescendo -@cindex Crescendo and Decrescendo -@cindex crescendo -@cindex @code{\cr} -@cindex @code{\rc} -@cindex @code{\decr} -@cindex @code{\rced} -@cindex @code{\<} -@cindex @code{\>} -@cindex @code{\"!} - - - -A crescendo mark is started with @code{\cr} and terminated with -@code{\rc}, the textual reverse of @code{cr}. A decrescendo mark is -started with @code{\decr} and terminated with @code{\rced}. There are -also shorthands for these marks. A crescendo can be started with -@code{\<} and a decrescendo can be started with @code{\>}. Either one -can be terminated with @code{\!}. Note that @code{\!} must go before -the last note of the dynamic mark whereas @code{\rc} and @code{\rced} go -after the last note. Because these marks are bound to notes, if you -want to get several marks during one note, you must use spacer notes. - -@lilypond[fragment,verbatim,center] - c'' \< \! c'' d'' \decr e'' \rced - < f''1 { s4 \< \! s2 \> \! s4 } > -@end lilypond - -[todo: text cr] - -@c. {Text spanner} +@c . {Text spanner} @node Text spanner @subsubsection Text spanner @cindex Text spanner -Have crescendo set a text spanner instead of hairpin - -@lilypond[fragment,relative,verbatim] - \context Voice { - \property Voice.crescendoText = "cresc." - \property Voice.crescendoSpanner = #'dashed-line - a''2\mf\< a a \!a - } -@end lilypond - -@c. {Ottava} +@c . {Ottava} @node Ottava @subsubsection Ottava @cindex Ottava @unnumberedsubsubsec Ottava +[move to trick. Not a supported feature.] + @lilypond[fragment,relative,verbatim] a'''' b c a \property Voice.TextSpanner \set #'type = #'dotted-line @@ -1244,12 +1250,7 @@ Have crescendo set a text spanner instead of hairpin -@c. {Text crescendo and decrescendo} -@unnumberedsubsubsec Text crescendo and decrescendo - -TODO - -@c. {Span requests} +@c . {Span requests} @node Span requests @subsubsection Span requests @cindex Span requests @@ -1265,9 +1266,9 @@ TODO Define a spanning request. The @var{startstop} parameter is either -1 (@code{\start}) or 1 (@code{\stop}) and @var{type} is a string that describes what should be started. Supported types are @code{crescendo}, -@code{decrescendo}, @code{beam}, @code{slur}. This is an internal -command. Users should use the shorthands which are defined in the -initialization file @file{spanners.ly}. +@code{decrescendo}, @code{beam}, @code{slur}. [FIXME: many more] This +is an internal command. Users should use the shorthands which are +defined in the initialization file @file{spanners.ly}. You can attach a (general) span request to a note using @@ -1279,24 +1280,16 @@ You can attach a (general) span request to a note using The slur syntax with parentheses is a shorthand for this. -@c. {Ornaments} +@c . {Ornaments} @node Ornaments @subsection Ornaments @cindex Ornaments @menu * Articulation:: * Text scripts:: -* Grace notes:: -* Stem tremolo:: -* Arpeggio:: -* Glissando :: -* Dynamics:: -* Bar lines:: -* Breath marks:: -* Rehearsal marks:: @end menu -@c. {Articulation} +@c . {Articulation} @node Articulation @subsubsection Articulation @cindex Articulation @@ -1347,7 +1340,7 @@ name of the corresponding symbol appearing underneath. @end lilypond -@c. {Text scripts} +@c . {Text scripts} @node Text scripts @subsubsection Text scripts @cindex Text scripts @@ -1361,7 +1354,7 @@ can be placed by simply using digits. All of these note ornaments appear in the printed output but have no effect on the MIDI rendering of the music. -@c. {Fingerings} +@c . {Fingerings} @unnumberedsubsubsec Fingerings @cindex Fingerings @@ -1420,143 +1413,132 @@ This is equivalent to @code{c4-6 c4-"foo"}. @cindex @code{\script} @cindex scripts +@cindex superscript +@cindex subscript @example - \script @var{alias} @end example -@cindex @code{\script} Prints a symbol above or below a note. The argument is a string which -points into the script-alias table defined in @file{scm/script.scm}, for -information on how to add scripts, read the comments in that file. +points into the script-alias table defined in @file{scm/script.scm}. Usually the @code{\script} keyword is not used directly. Various helpful identifier definitions appear in @file{script.ly}. +For information on how to add scripts, consult @file{scm/script.scm}. + -@c. {Grace notes} +@c . {Grace notes} @node Grace notes -@subsubsection Grace notes -@cindex Grace notes +@subsection Grace notes -See @ref{Grace music}. -@c. {Stem tremolo} -@node Stem tremolo -@subsubsection Stem tremolo -@cindex tremolo marks -@cindex @code{tremoloFlags} -[FIXME: should be \repeat] -Tremolo marks can be printed on a single note by adding -`@code{:}[@var{length}]' after the note. The length must be at -least 8. A @var{length} value of 8 gives one line across -the note stem. If the length is omitted, then the last value is -used, or the value of the @code{tremoloFlags} property if there was -no last value. -@lilypond[verbatim,fragment,center] - c'2:8 c':32 -@end lilypond -@c. {Arpeggio} -@node Arpeggio -@subsubsection Arpeggio -@cindex Arpeggio +@cindex Grace music +@cindex @code{\grace} +@cindex ornaments +@cindex grace notes +@cindex @code{graceAlignPosition} -@cindex broken arpeggio -@cindex @code{\arpeggio} +@example + \grace @var{musicexpr} +@end example -You can specify an @rgrob{Arpeggio} sign on a chord by issuing an -@c FIXME +A grace note expression has duration 0; the next real note is +assumed to be the main note. -@code{\arpeggio} request: +You cannot have the grace note after the main note, in terms of +duration, and main notes, but you can typeset the grace notes to the +right of the main note using the property +@code{graceAlignPosition}. +@cindex @code{flagStyle} +When grace music is interpreted, a score-within-a-score is set up: +@var{musicexpr} has its own time bookkeeping, and you could (for +example) have a separate time signature within grace notes. While in +this score-within-a-score, you can create notes, beams, slurs, etc. +Unbeamed eighth notes and shorter by default have a slash through the +stem. This behavior can be controlled with the +@code{flagStyle} property. @quotation -@lilypond[fragment,relative,verbatim] - \context Voice +@lilypond[fragment,verbatim] +\relative c'' { + \grace c8 c4 \grace { [c16 c16] } c4 + \grace { \property Grace.flagStyle = "" c16 } c4 +} + @end lilypond @end quotation -Typesetting of simultanious chords with arpeggios can be controlled with -the property @code{PianoStaff.connectArpeggios} @footnote{ FIXME: -connectArpeggios. Can't find the English terms for two kinds of -arpeggio (Dutch: gebroken arpeggio vs doorlopend arpeggio).} By -default, LilyPond prints broken arpeggios; when set to true, one -extended arpeggio sign is printed. -@quotation -@lilypond[fragment,relative,verbatim] - \context PianoStaff < - \property PianoStaff.connectArpeggios = ##t - \context Staff \context Voice - \context Staff=other \context Voice - > -@end lilypond -@end quotation +At present, nesting @code{\grace} notes is not supported. The following +may cause run-time errors: +@example + @code{\grace @{ \grace c32 c16 @} c4} +@end example +Since the meaning of such a construct is unclear, we don't consider +this a loss. Similarly, juxtaposing two @code{\grace} sections is +syntactically valid, but makes no sense and may cause runtime errors. +Ending a staff or score with grace notes may also generate a run-time +error, since there will be no main note to attach the grace notes to. -@c. {Glissando} -@node Glissando -@subsubsection Glissando -@cindex Glissando +The present implementation is not robust and generally kludgy. We expect +it to change after LilyPond 1.4. Syntax changes might also be +implemented. -@cindex @code{\glissando} -A @rgrob{Glissando} line can be requested by issuing a -FIXME -@code{\glissando} request: -@quotation -@lilypond[fragment,relative,verbatim] - c'' \glissando c' -@end lilypond -@end quotation -Printing of the additional text @samp{gliss.} must be done manually. + +@c . {Stem tremolo} +@menu +* Glissando :: +* Dynamics:: +* Crescendo and Decrescendo:: +* Bar lines:: +* Breath marks:: +* Rehearsal marks:: +@end menu + -@c. {Follow Thread} -@subsubsection Follow Thread -@cindex follow thread -@cindex staff switching -@cindex cross staff +@c . {Glissando} +@node Glissando +@subsubsection Glissando +@cindex Glissando -@c Documented here because it looks like a glissando... -@cindex @code{followThread} -A glissando-like line can be printed to connect notes whenever a thread -switches to another staff. This is enabled if the property -@code{PianoStaff.followThread} is set to true: +@cindex @code{\glissando} + +A glissando line can be requested by attaching a @code{\glissando} to a +note: @quotation @lilypond[fragment,relative,verbatim] - \context PianoStaff < - \property PianoStaff.followThread = ##t - \context Staff \context Voice { - c'1 - \translator Staff=two - b2 a - } - \context Staff=two {\clef bass; \skip 1*2;} - > + c'' \glissando c' @end lilypond @end quotation +Printing of an additional text (such as @emph{gliss.}) must be done +manually. + -@c. {Dynamics} +@c . {Dynamics} @node Dynamics @subsubsection Dynamics @cindex Dynamics -@unnumberedsubsec Dynamics + @cindex @code{\ppp} @cindex @code{\pp} @@ -1575,22 +1557,62 @@ switches to another staff. This is enabled if the property @cindex @code{\sfz} @cindex @code{\rfz} + + + + + Dynamic marks are specified by using an identifier after a note: -@code{c4-\ff} (the dash is optional for dynamics: `@code{c4 \ff})'. -The available dynamic marks are: -@code{\ppp}, -@code{\pp}, @code{\p}, @code{\mp}, -@code{\mf}, @code{\f}, @code{\ff}, -@code{\fff}, @code{\fff}, -@code{\fp}, @code{\sf}, -@code{\sff}, @code{\sp}, -@code{\spp}, @code{\sfz}, and -@code{\rfz}. +@code{c4-\ff}. The available dynamic marks are: +@code{\ppp}, @code{\pp}, @code{\p}, @code{\mp}, @code{\mf}, @code{\f}, +@code{\ff}, @code{\fff}, @code{\fff}, @code{\fp}, @code{\sf}, +@code{\sff}, @code{\sp}, @code{\spp}, @code{\sfz}, and @code{\rfz}. + +@c . {Crescendo and Decrescendo} +@node Crescendo and Decrescendo +@subsubsection Crescendo and Decrescendo + +@cindex Crescendo and Decrescendo +@cindex crescendo +@cindex @code{\cr} +@cindex @code{\rc} +@cindex @code{\decr} +@cindex @code{\rced} +@cindex @code{\<} +@cindex @code{\>} +@cindex @code{\"!} + + + +A crescendo mark is started with @code{\cr} and terminated with +@code{\rc}, the textual reverse of @code{cr}. A decrescendo mark is +started with @code{\decr} and terminated with @code{\rced}. There are +also shorthands for these marks. A crescendo can be started with +@code{\<} and a decrescendo can be started with @code{\>}. Either one +can be terminated with @code{\!}. Note that @code{\!} must go before +the last note of the dynamic mark whereas @code{\rc} and @code{\rced} go +after the last note. Because these marks are bound to notes, if you +want to get several marks during one note, you must use spacer notes. + +@lilypond[fragment,verbatim,center] + c'' \< \! c'' d'' \decr e'' \rced + < f''1 { s4 \< \! s2 \> \! s4 } > +@end lilypond + +You can also use a text saying @emph{cresc.} instead of hairpins. Here +is an example how to do it: + +@lilypond[fragment,relative,verbatim] + \context Voice { + \property Voice.crescendoText = "cresc." + \property Voice.crescendoSpanner = #'dashed-line + a''2\mf\< a a \!a + } +@end lilypond -See also @ref{Crescendo and Decrescendo} -@c. {Bar lines} +@c . {Bar lines} @node Bar lines @subsubsection Bar lines @cindex Bar lines @@ -1599,78 +1621,200 @@ See also @ref{Crescendo and Decrescendo} @cindex measure lines @cindex repeat bars -@example - \bar @var{bartype}; -@end example +@example + \bar @var{bartype}; +@end example + +This is a short-cut for doing +@example + \property Score.whichBar = @var{bartype} +@end example + +You are encouraged to use @code{\repeat} for repetitions. See +@ref{Repeat}, and the documentation of @code{whichBar} in +@ref{(lilypond-internals)LilyPond context properties}. + + +[FIXME] + +@c . {Breath marks} +@node Breath marks +@subsubsection Breath marks +@cindex Breath marks + +@c . {Rehearsal marks} +@node Rehearsal marks +@subsubsection Rehearsal marks +@cindex Rehearsal marks +@cindex mark +@cindex @code{\mark} + +@example + \mark @var{unsigned}; +@cindex @code{Mark_engraver} + \mark @var{string}; +@end example + +Prints a mark over or under the staff. + + +@c . {Bar check} +@node Bar check +@subsection Bar check +@cindex Bar check + +@cindex bar check +@cindex @code{barCheckNoSynchronize} +@cindex @code{|} + + +Whenever a bar check is encountered during interpretation, a warning +message is issued if it doesn't fall at a measure boundary. This can +help you find errors in the input. Depending on the value of +@code{barCheckNoSynchronize}, the beginning of the measure will be +relocated, so this can also be used to shorten measures. + +A bar check is entered using the bar symbol, @code{|} + + + + + + + + +@c . {Piano music} +@node Piano music +@section Piano music +@menu +* Automatic staff changes:: +* Manual staff switches:: +* Pedals:: +* Arpeggio:: +* Follow Thread:: +@end menu + + +@c . {Automatic staff changes} +@node Automatic staff changes +@subsection Automatic staff changes +@cindex Automatic staff changes + +[\autochange] + +@node Manual staff switches +@subsection Manual staff switches + +@cindex manual staff switches +@cindex staff switch, manual + +@cindex @code{\translator} +@example + \translator @var{contexttype} = @var{name} +@end example + +A music expression indicating that the context which is a direct +child of the a context of type @var{contexttype} should be shifted to +a context of type @var{contexttype} and the specified name. + +Usually this is used to switch staffs in Piano music, e.g. + +@example + \translator Staff = top @var{Music} +@end example + + +@c . {Pedals} +@node Pedals +@subsection Pedals +@cindex Pedals + +[todo] + + +@c . {Arpeggio} +@node Arpeggio +@subsection Arpeggio +@cindex Arpeggio + +@cindex broken arpeggio +@cindex @code{\arpeggio} + +You can specify an arpeggio sign on a chord by attaching an +@code{\arpeggio} to a note of the chord. + + +@quotation +@lilypond[fragment,relative,verbatim] + \context Voice +@end lilypond +@end quotation + +When an arpeggio crosses staffs in piano music, you attach an arpeggio +to the chords in both staffs, and set +@code{PianoStaff.connectArpeggios}. LilyPond will connect the arpeggios +in both staffs. -This is a short-cut for doing -@example - \property Score.whichBar = @var{bartype} -@end example +@quotation +@lilypond[fragment,relative,verbatim] + \context PianoStaff < + \property PianoStaff.connectArpeggios = ##t + \context Voice = one { } + \context Voice = other { \clef bass; } + > +@end lilypond +@end quotation -You are encouraged to use @code{\repeat} for repetitions. See -@ref{Repeat}, @ref{Volta}, and the documentation of @code{whichBar} in -@ref{(lilypond-internals)LilyPond context properties}. -[FIXME] +@c . {Follow Thread} +@node Follow Thread +@subsection Follow Thread +@cindex follow thread +@cindex staff switching +@cindex cross staff -@c. {Breath marks} -@node Breath marks -@subsubsection Breath marks -@cindex Breath marks +[todo: different name, eg. voice line ? ] -@c. {Rehearsal marks} -@node Rehearsal marks -@subsubsection Rehearsal marks -@cindex Rehearsal marks -@cindex mark -@cindex @code{\mark} +@cindex @code{followThread} -@example - \mark @var{unsigned}; -@cindex @code{Mark_engraver} - \mark @var{string}; -@end example +Whenever a voice switches to another staff a line connecting the notes +can be printed automatically. This is enabled if the property +@code{PianoStaff.followThread} is set to true: -Prints a mark over or under the staff. +@quotation +@lilypond[fragment,relative,verbatim] + \context PianoStaff < + \property PianoStaff.followThread = ##t + \context Staff \context Voice { + c'1 + \translator Staff=two + b2 a + } + \context Staff=two {\clef bass; \skip 1*2;} + > +@end lilypond +@end quotation -@c. {Bar check} -@node Bar check -@subsection Bar check -@cindex Bar check -@cindex bar check -@cindex @code{barCheckNoSynchronize} -@cindex @code{|} -Bar checks help you find errors in the input: Whenever one is -encountered during interpretation, a warning message is issued if it -doesn't fall at a measure boundary. Depending on the value of -@code{barCheckNoSynchronize}, the beginning of the measure will be -relocated, so this can also be used to shorten measures. -A bar check is entered using the bar symbol, @code{|} -This can help you finding errors in the input. +@c . {Lyrics} +@node Lyrics +@section Lyrics -@c. {Lyrics entry} -@node Lyrics entry -@section Lyrics entry -@cindex Lyrics entry @menu * Lyrics mode:: * Printing lyrics:: -* Lyric hyphen:: -* Lyric extender:: -* Addlyrics:: +* Automatic syllable durations:: @end menu -@c. {Lyrics mode} +@c . {Lyrics mode} @node Lyrics mode @subsection Lyrics mode @cindex Lyrics mode @@ -1713,8 +1857,6 @@ _ _ _ _ % 4 words, each one a space Since combinations of numbers and dots are used for indicating durations, you can not enter real numbers in this mode. -[todo: include short table showing differences] - @cindex lyrics expressions Syllables are entered like notes, with pitches replaced by text. For @@ -1727,24 +1869,17 @@ lyrics. Spaces can be introduced into a lyric either by using quotes (@code{"}) or by using an underscore without quotes: @code{He_could4 not4}. All unquoted underscores are converted to spaces. Printing -lyrics is discussed in section @ref{lyricprint}. +lyrics is discussed in the next section. -@c. {Printing Lyrics} +@c . {Printing lyrics} @node Printing lyrics -@subsection lyricprint +@subsection Printing lyrics @cindex lyrics -@cindex printing!lyrics - - -Lyric syllables must be interpreted within a @code{Lyrics} context - -@cindex context!Lyrics - for printing them. - -Here is a full example: +Lyric syllables must be interpreted within a @code{Lyrics} context for +printing them. Here is a full example: @quotation @lilypond[verbatim] @@ -1764,6 +1899,12 @@ Here is a full example: @end lilypond @end quotation + + + +@cindex extender +@cindex lyric extender + You may want a continuous line after the syllables to show melismata. To achieve this effect, add a @code{__} lyric as a separate word after the lyric to be extended. This will create an extender, a line @@ -1788,7 +1929,8 @@ shorten it by using a blank lyric (using @code{_}). @end lilypond @end quotation - +@cindex Lyric hyphen + If you want to have hyphens centered between syllables (rather than attached to the end of the first syllable) you can use the special `@code{-}@code{-}' lyric as a separate word between syllables. This @@ -1816,34 +1958,10 @@ For example: @end quotation - - -@c. {Lyric hyphen} -@node Lyric hyphen -@subsection Lyric hyphen -@cindex Lyric hyphen - -The syntax for a spanning hyphen (i.e., a hyphen that will be printed -between two lyric syllables) is `@code{-}@code{-}'. - -@c. {Lyric extender} -@node Lyric extender -@subsection Lyric extender -@cindex Lyric extender -@cindex extender -@cindex lyric extender -@cindex hyphen - -The syntax for an extender mark is @code{__}. This syntax can only -be used within lyrics mode. - - - - -@c. {Addlyrics} -@node Addlyrics -@subsection Addlyrics -@cindex Addlyrics +@c . {Automatic syllable durations} +@node Automatic syllable durations +@subsection Automatic syllable durations +@cindex Automatic syllable durations [explain automatic phrasing] @@ -1901,10 +2019,12 @@ lyrics for @var{musicexpr2}. -@c. {Chord entry} -@node Chord entry -@section Chord entry -@cindex Chord entry +@c . {Chords} +@node Chords +@section Chords +@cindex Chords + +[chords vs. simultaneous music] @menu * Chords mode:: @@ -1912,7 +2032,7 @@ lyrics for @var{musicexpr2}. * Printing named chords:: @end menu -@c. {Chords mode} +@c . {Chords mode} @node Chords mode @subsection Chords mode @cindex Chords mode @@ -1927,7 +2047,7 @@ durations, you can not enter real numbers in this mode. Dashes and carets are used to indicate chord additions and subtractions, so scripts can not be entered in Chord mode. -@c. {Entering named chords} +@c . {Entering named chords} @node Entering named chords @subsection Entering named chords @cindex Chords names @@ -2038,19 +2158,22 @@ so it becomes the lowest note in the chord. @end lilypond -The most interesting application is printing chords using chord names, -See @ref{Chord names}. +The most interesting application is printing chord names, which is +explained in the next subsection. You should not combine @code{\relative} with named chords. [FIXME] -@c. {Printing named chords} +@c . {Printing named chords} @node Printing named chords @subsection Printing named chords + + + + +@cindex printing chord names @cindex chord names @cindex chords - -@cindex printing!chord names @cindex @code{ChordNames} @cindex @code{ChordNameVoice} @@ -2264,7 +2387,7 @@ scheme = \chords { -@c. {Page layout} +@c . {Page layout} @node Page layout @section Page layout @cindex Page layout @@ -2278,7 +2401,7 @@ scheme = \chords { * Page break:: @end menu -@c. {Paper block} +@c . {Paper block} @node Paper block @subsection Paper block @cindex Paper block @@ -2296,34 +2419,9 @@ where each of the items is one of @item An assignment. The assignment must be terminated by a semicolon. - @item A context definition. See section @ref{contextdefs} for + @item A context definition. See section @ref{Context definitions} for more information on context definitions. -@ignore - - FIXME - - - @item - - A margin shape declaration. The syntax is -@cindex @code{\shape} - @example - - \shape @var{indent1}@code{,} @var{width1}@code{,} - @var{indent2}@code{,} @var{width2} @dots{} @code{;} - @end example - - - - Each pair of @var{indent} and @var{width} values is a dimension - specifying how far to indent and how wide to make the line. - The indentation and width of successive lines are specified by - the successive pairs of dimensions. The last pair of - dimensions will define the characeristics of all lines beyond - those explicitly specified. -@end ignore - @item \stylesheet declaration. Its syntax is @example \stylesheet @var{alist} @@ -2332,7 +2430,7 @@ where each of the items is one of See @file{font.scm} for details of @var{alist}. @end itemize -@c. {Paper variables} +@c . {Paper variables} @node Paper variables @subsection Paper variables @cindex Paper variables @@ -2347,17 +2445,16 @@ The paper block has some variables you may want to use or change: @item @code{staffspace} The distance between two staff lines, calculated from the center - of the lines. You should use either this or @code{rulethickness} + of the lines. You should use either this or @code{stafflinethickness} as a unit for distances you modify. @cindex @code{linewidth} @item @code{linewidth} - Sets the width of the lines. If set to -1.0, a single - unjustified line is produced. If you use this variable, you - probably want to define it in staff spaces, ie - @example - linewidth = 30 * \staffspace; - @end example + Sets the width of the lines. + +If set to a negative value, a single + unjustified line is produced. + @cindex @code{textheight} @item @code{textheight} @@ -2382,7 +2479,8 @@ The paper block has some variables you may want to use or change: @end table -@c. {Font size} + +@c . {Font size} @node Font Size @subsection Font size @cindex font size @@ -2404,7 +2502,7 @@ details, see the file @file{font.scm}. -@c. {Paper size} +@c . {Paper size} @node Paper size @subsection Paper size @cindex Paper size @@ -2440,22 +2538,9 @@ will set the paper variables @code{hsize} and @code{vsize} (used by -@c. {Line break} +@c . {Line break} @node Line break @subsection Line break -@cindex Line break - - -@cindex @code{\penalty} - -@example - \penalty @var{int} @code{;} -@end example - -Discourage or encourage line breaks. See @ref{Page layout}. - - - @cindex line breaks @cindex breaking lines @@ -2465,37 +2550,48 @@ that the resulting spacing has low variation, and looks neither cramped nor loose. Occasionally you might want to override the automatic breaks; you can do -this by specifying @code{\break} (see also @ref{Pre-defined -Identifiers}). This will force a line break at this point. Do remember -that line breaks can only occur at places where there are barlines. If -you want to have a line break where there is no barline, you can force a -barline by entering @code{\bar "";}. +this by specifying @code{\break}. This will force a line break at this +point. Do remember that line breaks can only occur at places where there +are barlines. If you want to have a line break where there is no +barline, you can force a barline by entering @code{\bar "";}. + +Similarly, @code{\noBreak} forbids a line break at a certain point. +@cindex @code{\penalty} + +The @code{\break} and @code{\noBreak} commands are defined in terms of +the penalty command: +@example + \penalty @var{int} @code{;} +@end example +This imposes encourages or discourages LilyPond to make a line break +at this point. +@strong{Warning} do not use @code{\penalty} directly. It is rather +kludgy, and slated for rewriting. -@c. {Page break} +@c . {Page break} @node Page break @subsection Page break -@cindex Page break +@cindex page breaks +@cindex breaking pages -Not implemented, but see @ref{Tricks} Page breaks are normally computed by @TeX{}, so they are not under direct -control. However, you can insert a commands into the .tex output to +control. However, you can insert a commands into the @file{.tex} output to instruct @TeX{} where to break pages. For more details, see the example file @file{input/test/between-systems.ly} +[or -> Tricks? ] -@cindex page breaks -@cindex breaking pages -@c. {Sound} +@c . {Sound} @node Sound @section Sound @cindex Sound @@ -2505,7 +2601,7 @@ example file @file{input/test/between-systems.ly} * Tempo:: @end menu -@c. {MIDI block} +@c . {MIDI block} @node MIDI block @subsection MIDI block @cindex MIDI block @@ -2531,7 +2627,7 @@ Context definitions follow precisely the same syntax as within the The contexts for MIDI output are defined in @file{ly/performer.ly}. -@c. {MIDI instrument names} +@c . {MIDI instrument names} @node MIDI instrument names @subsection MIDI instrument names @cindex instrument names @@ -2597,7 +2693,7 @@ default piano. -@c. {Tempo} +@c . {Tempo} @node Tempo @subsection Tempo @cindex Tempo @@ -2616,69 +2712,92 @@ output with 76 quarter notes per minute. -@c. {Music entry} +@c . {Music entry} @node Music entry @section Music entry @cindex Music entry @menu -* Pre-defined Identifiers:: +* Relative:: * Point and click:: @end menu -@c. {Pre-defined Identifiers} -@node Pre-defined Identifiers -@subsection Pre-defined Identifiers -@cindex pre-defined identifiers -Various identifiers are defined in the initialization files to -provide shorthands for some settings. Most of them are in -@file{ly/declarations.ly} and @file{ly/property.ly}. +@c . {Relative} +@node Relative +@subsection Relative +@cindex Relative +@cindex relative octave specification + +Octaves are specified by adding @code{'} and @code{,} to pitch names. +When you copy existing music, it is easy to accidentally put a pitch in +the wrong octave and hard to find such an error. To prevent these +errors, LilyPond features octave entry. + +@cindex @code{\relative} +@example + \relative @var{startpitch} @var{musicexpr} +@end example -@table @code -@cindex @code{\break} - @item @code{\break} - Force a line break in music by using a large argument for the - keyword @code{\penalty}. +The octave of notes that appear in @var{musicexpr} are calculated as +follows: If no octave changing marks are used, the basic interval +between this and the last note is always taken to be a fourth or less. + The octave changing marks @code{'} and @code{,} can then +be added to raise or lower the pitch by an extra octave. Upon entering +relative mode, an absolute starting pitch must be specified that will +act as the predecessor of the first note of @var{musicexpr}. -@cindex @code{\nobreak} - @item @code{\nobreak} - Prevent a line break in music by using a large negative argument - for the keyword @code{\penalty}. +This distance is determined without regarding accidentals: a +@code{fisis} following a @code{ceses} will be put above the +@code{ceses}. -@cindex @code{\shiftOff} - @item @code{\shiftOff} - Disable horizontal shifting of note heads that collide. +Entering scales is straightforward in relative mode. -@cindex @code{\shiftOn} - @item @code{\shiftOn} - Enable note heads that collide with other note heads to be - shifted horiztonally. Also @code{\shiftOnn} and @code{\shiftOnnn} -set different shift values. +@lilypond[fragment,verbatim,center] + \relative c'' { + g a b c d e f g g, g + } +@end lilypond -@cindex @code{\stemBoth} - @item @code{\stemBoth} - Allow stems, beams, and slurs to point either upwards or - downwards, decided automatically by LilyPond. +And octave changing marks are used for intervals greater than a fourth. -@cindex @code{\stemDown} - @item @code{\stemDown} - Force stems, beams, and slurs to point down. +@lilypond[fragment,verbatim,center] + \relative c'' { + c g c f, c' a, e'' } +@end lilypond -@cindex @code{\stemUp} - @item @code{\stemUp} - Force stems, beams and slurs to point up. +If the preceding item is a chord, the first note of the chord is used +to determine the first note of the next chord. But other notes +within the second chord are determined by looking at the immediately +preceding note. -@end table +@lilypond[fragment,verbatim,center] + \relative c' { + c + + + } +@end lilypond +@cindex @code{\notes} + +The pitch after the @code{\relative} contains a notename. To parse +the pitch as a notename, you have to be in note mode, so there must +be a surrounding @code{\notes} keyword (which is not +shown here). + +The relative conversion will not affect @code{\transpose} or +@code{\relative} sections in its argument. If you want to use +relative within transposed music, you must place an additional +@code{\relative} inside the @code{\transpose}. -@c. {Point and click} +@c . {Point and click} @node Point and click @subsection Point and click [todo] -@c. {Engravers} +@c . {Engravers} @node Engravers @section Engravers @cindex engravers @@ -2687,7 +2806,9 @@ set different shift values. * Notation Contexts:: @end menu -@c. {Context definitions} +[rewrite this entirely] + +@c . {Context definitions} @node Context definitions @subsection Context definitions @@ -2725,14 +2846,11 @@ A context definition has this syntax: @code{@}} @end example -@var{translatorinit} can be an identifier or of the form - +@var{translatorinit} can be an identifier or @example - \type @var{typename} @code{;} @end example - -@var{typename} is one of +where @var{typename} is one of @table @code @cindex @code{Engraver_group_engraver} @@ -2786,8 +2904,7 @@ completeness, but is never used in practice. the name is not specified, the translator won't do anything. @item @var{propname} @code{=} @var{value} @code{;} - A property assignment. It is allowed to use reals for - @var{value}. + A property assignment. @end itemize In the @code{\paper} block, it is also possible to define translator @@ -2835,26 +2952,14 @@ translators. The pre-defined identifiers are: @item @code{ScoreContext} Default Score context. -@cindex @code{ScoreWithNumbers} - @item @code{ScoreWithNumbers} - Score context with numbering at the Score level. -@cindex @code{BarNumberingStaffContext} - - @item @code{BarNumberingStaffContext} - Staff context with numbering at the Staff level. @cindex @code{HaraKiriStaffContext} @item @code{HaraKiriStaffContext} Staff context that does not print if it only contains rests. Useful for orchestral scores.@footnote{Harakiri, also called Seppuku, is the ritual suicide of the Japanese Samourai warriors.} -@cindex @code{OrchestralPartStaffContext} - - @item @code{OrchestralPartStaffContext} -@cindex @code{OrchestralScoreContext} - @item @code{OrchestralScoreContext} @end table Using these pre-defined values, you can remove or add items to the @@ -2877,7 +2982,7 @@ translator: -@c. {Notation Contexts} +@c . {Notation Contexts} @node Notation Contexts @subsection Notation Contexts @@ -3032,10 +3137,10 @@ called @emph{performers}. -@c. {Lexer innards} -@node Lexer innards -@section Lexer innards -@cindex Lexer innards +@c . {Syntactic details} +@node Syntactic details +@section Syntactic details +@cindex Syntactic details @menu * Top level:: * Identifiers:: @@ -3045,7 +3150,7 @@ called @emph{performers}. * Ambiguities:: @end menu -@c. {Top level} +@c . {Top level} @node Top level @subsection Top level @cindex Top level @@ -3067,19 +3172,19 @@ definition. A score block has the following syntax: definition is supplied, the default @code{\paper} block will be added. -@c. {Score} +@c . {Score} @subsubsection Score @cindex Score -@c. {Paper} +@c . {Paper} @subsubsection Paper @cindex Paper -@c. {Midi} +@c . {Midi} @subsubsection Midi @cindex Midi -@c. {Header} +@c . {Header} @subsubsection Header @cindex Header @cindex @code{\header} @@ -3107,7 +3212,7 @@ A @code{\midi} or @code{\paper} block at top-level sets the default paper block for all scores that lack an explicit paper block. -@c. {Identifiers} +@c . {Identifiers} @node Identifiers @subsection Identifiers @cindex Identifiers @@ -3119,10 +3224,9 @@ number, boolean, etc.), LilyPond has a number of specialized data types, @itemize @bullet @item Input @item c++-function -@item Music: see @ref{Music expressions} +@item Music @item Identifier -@item Translator_def: -See section @ref{contextdefs} for more information +@item Translator_def @item Duration @item Pitch @item Score @@ -3148,7 +3252,7 @@ not yet user accessible. @end itemize -@c. {Assignments} +@c . {Assignments} @node Assignments @subsection Assignments @cindex Assignments @@ -3167,7 +3271,7 @@ that this problem will grow smaller. An identifier can be created with any string for its name, but you will only be able to refer to identifiers whose names begin with a letter, -being entirely alphanumeric. It is impossible to refer to an identifier +being entirely alphabetical. It is impossible to refer to an identifier whose name is the same as the name of a keyword. The right hand side of an identifier assignment is parsed completely @@ -3183,26 +3287,23 @@ copied. For this reason, an identifier reference must always be the first item in a block. @example \paper @{ -foo = 1.0 -\paperIdent % wrong and invalid + foo = 1.0 + \paperIdent % wrong and invalid @} \paper @{ -\paperIdent % correct -foo = 1.0 -@} + \paperIdent % correct + foo = 1.0 @} @end example - - -@c. {Lexical details} +@c . {Lexical details} @node Lexical details @subsection Lexical details @cindex Lexical details @menu @end menu -@c. {Comments} +@c . {Comments} @subsubsection Comments @cindex Comments @@ -3210,10 +3311,10 @@ foo = 1.0 A one line comment is introduced by a @code{%} character. -Block comments are started by @code{%@{} and ended by `@code{%@}}'. +Block comments are started by @code{%@{} and ended by @code{%@}}. They cannot be nested. -@c. {Direct Scheme} +@c . {Direct Scheme} @subsubsection Direct Scheme @cindex Scheme @cindex GUILE @@ -3242,7 +3343,7 @@ the website @uref{http://www.schemers.org/} for more information on Scheme. -@c. {Keywords} +@c . {Keywords} @subsubsection Keywords @cindex Keywords @@ -3263,7 +3364,7 @@ script stylesheet skip textscript tempo translator transpose type @end example -@c. {Integers} +@c . {Integers} @subsubsection Integers @cindex integers @@ -3276,7 +3377,7 @@ Formed from an optional minus sign followed by digits. Arithmetic operations cannot be done with integers, and integers cannot be mixed with reals. -@c. {Reals} +@c . {Reals} @subsubsection Reals @cindex real numbers @@ -3302,7 +3403,7 @@ points, inches and centimeters, respectively. This converts the number to a real that is the internal representation of dimensions. -@c. {Strings} +@c . {Strings} @subsubsection Strings @cindex string @cindex concatenate @@ -3311,15 +3412,15 @@ Begins and ends with the @code{"} character. To include a @code{"} character in a string write @code{\"}. Various other backslash sequences have special interpretations as in the C language. A string that contains no spaces can be written without the quotes. See -@ref{Lexical modes} for details on unquoted strings; their interpretation varies -depending on the situation. Strings can be concatenated with the -@code{+} operator. +@ref{Lexical modes} for details on unquoted strings; their +interpretation varies depending on the situation. Strings can be +concatenated with the @code{+} operator. The tokenizer accepts the following commands. They have no grammatical function, hence they can appear anywhere in the input. -@c. {Main input} +@c . {Main input} @subsubsection Main input @cindex Main input @@ -3328,7 +3429,7 @@ function, hence they can appear anywhere in the input. The @code{\maininput} command is used in init files to signal that the user file must be read. This command cannot be used in a user file. -@c. {File inclusion} +@c . {File inclusion} @subsubsection Main input @cindex Main input @@ -3357,34 +3458,18 @@ See @ref{convert-ly} for more information on @code{convert-ly}. @cindex convert-ly - - -@c. {Pitch names} -@subsubsection Pitch names +@c . {Pitch names} +@subsubsection Defining pitch names @cindex Lexical modes -@cindex pitch names - +@cindex definining pitch names +@cindex pitch names, definining @cindex note names @cindex chord modifier names -Note names and chord modifiers can be customised for nationalities. -languages and conventions. The syntax is as follows. -@cindex @code{\pitchnames} -@cindex @code{\chordmodifiers} - -@example - \pitchnames @var{scheme-alist} - \chordmodifiers @var{scheme-alist} -@end example - -See @file{ly/nederlands.ly} and @file{ly/chord-modifiers.ly} for -specific examples how to do this. tables can be tailored specified -using. Some national note names have been provided, see -section @ref{Other languages}. A @code{\paper} block at top level sets the default paper block. A @code{\midi} block at top level works similarly. -@c. {Assignments} +@c . {Assignments} @subsubsection Assignments @cindex assignments @cindex @code{#} @@ -3393,64 +3478,46 @@ Identifier assignments may appear at top level. @ref{Assignments} -@c. {Direct scheme} +@c . {Direct scheme} @subsubsection Direct scheme @cindex Direct scheme Scheme statements maybe issued to produce interesting side-effects. -@c. {Lexical modes} +@c . {Lexical modes} @node Lexical modes @subsection Lexical modes @cindex Lexical modes - -@cindex Lexical modes -@cindex modes +@cindex input mode +@cindex mode, input +@cindex @code{\notes} +@cindex @code{\chords} +@cindex @code{\lyrics} To simplify entering notes, lyrics, and chords, LilyPond has three -special input modes on top of the default mode. In each mode, words -are identified on the input. If @code{"word"} is encountered, it is -treated as a string. If @code{\word} is encountered, it is treated as -a keyword or as an identifier. The behavior of the modes differs in -two ways: Different modes treat unquoted words differently, and -different modes have different rules for deciding what is a word. - -@table @asis -@item Normal mode. -@cindex normal mode - -At the start of parsing, LilyPond is in Normal mode. In Normal -mode, a word is an alphabetic character followed by alphanumeric -characters. If @code{word} is encountered on the input it is -treated as a string. - -@item Note mode -See @ref{Note entry}. - -@item Lyrics mode -See @ref{Lyrics entry}. - -@item Chord mode -See @ref{Chord entry}. -@end table - -@cindex input modes +special input modes on top of the default mode: note, lyrics and chords +mode. These input modes change the way that normal, unquoted words are +interpreted: for example, the word @code{cis} may be interpreted as a +C-sharp, as a lyric syllable `cis' or as a C-sharp major triad +respectively. -@cindex mode switch +A mode switch is entered as a compound music expressions +@example +@code{\notes} @var{musicexpr} +@code{\chords} @var{musicexpr} +@code{\lyrics} @var{musicexpr}. +@end example -@cindex @code{\notes} -@cindex @code{\chords} -@cindex @code{\lyrics} +In each of these cases, these expressions do not add anything to the +meaning of their arguments. They are just a way to indicate that the +arguments should be parsed in indicated mode. The modes are treated in +more detail in the sections @ref{Note entry}, @ref{Lyrics} and +@ref{Chords}. -Mode switching keywords form compound music expressions: @code{\notes} -@var{musicexpr}, @code{\chords} @var{musicexpr}, -and @code{\lyrics} @var{musicexpr}. These -expressions do not add anything to the meaning of their arguments. They -are just a way to indicate that the arguments should be parsed in -indicated mode. See @ref{Lexical modes} for more information on modes. +You may nest different input modes. -@c. {Ambiguities} +@c . {Ambiguities} @node Ambiguities @subsection Ambiguities @cindex ambiguities @@ -3503,8 +3570,7 @@ foo = -6 - -@c. {Unsorted} +@c . {Unsorted} @node Unsorted @section Unsorted @@ -3515,6 +3581,9 @@ Translation? @cindex properties @unnumberedsubsec Translation property +[todo: add \set/\override/\revert] + + @cindex @code{\property} @example \property @var{contextname}.@var{propname} = @var{value} @@ -3525,24 +3594,6 @@ the specified @var{value}. All three arguments are strings. Depending on the context, it may be necessary to quote the strings or to leave space on both sides of the dot. -@cindex translator switches -@unnumberedsubsec Translator switches - -@cindex @code{\translator} -@example - \translator @var{contexttype} = @var{name} -@end example - -A music expression indicating that the context which is a direct -child of the a context of type @var{contexttype} should be shifted to -a context of type @var{contexttype} and the specified name. - -Usually this is used to switch staffs in Piano music, e.g. - -@example - \translator Staff = top @var{Music} -@end example - @cindex output properties @unnumberedsubsec Output properties @@ -3557,12 +3608,12 @@ you need to know exactly how the backend works. Example: \relative c'' { c4 \context Staff \outputproperty #(make-type-checker 'note-head-interface) - #'extra-offset = #'(5.0 . 7.5) + #'extra-offset = #'(0.5 . 0.75) } @end lilypond This selects all note heads occurring at current staff level, and sets -the @code{extra-offset} of those heads to @code{(5,7.5)}, shifting them +the @code{extra-offset} of those heads to @code{(0.5,0.75)}, shifting them up and right. Use of this feature is entirely on your own risk: if you use this, the @@ -3570,13 +3621,33 @@ result will depend very heavily on the implementation of the backend, which we change regularly and unscrupulously. -@c.{Local emacs vars} +Don't move the finger 2, only text "m.d." ... +@lilypond[verbatim] +#(define (make-text-checker text) + (lambda (grob) (equal? text (ly-get-elt-property grob 'text)))) + +\score { + \notes\relative c''' { + \property Voice.Stem \set #'direction = #1 + \outputproperty #(make-text-checker "m.d.") + #'extra-offset = #'(-3.5 . -4.5) + a^2^"m.d." + } + \paper { linewidth = -1.; } +} +@end lilypond + + + + + +@c .{Local emacs vars} @c Local variables: @c mode: texinfo @c minor-mode: font-lock @c minor-mode: outline @c outline-layout: (-1 : 0) -@c outline-use-mode-specific-leader: "@c\." +@c outline-use-mode-specific-leader: "@c \." @c outline-primary-bullet: "{" @c outline-stylish-prefixes: nil @c outline-override-protect: t diff --git a/Documentation/user/tricks.itely b/Documentation/user/tricks.itely index 7f6a5d1fb1..9e4ded359c 100644 --- a/Documentation/user/tricks.itely +++ b/Documentation/user/tricks.itely @@ -36,16 +36,12 @@ yes: \property Staff.VoltaBracket = #'((meta . ((interfaces . ())))) @menu * Manual beam settings:: Manual beam settings -* Slur attachments:: Slur attachments * Engraver hacking:: Engraver hacking * Part combiner:: Part combiner * Markup text:: Markup text -* Output property:: Output property * Apply hacking:: Apply hacking * Embedded TeX:: Embedded TeX * Embedded PostScript:: Embedded PostScript -@c * Index:: Checking Feature index -* Index:: Checking Feature index @end menu @@ -59,65 +55,6 @@ yes: \property Staff.VoltaBracket = #'((meta . ((interfaces . ())))) @c auto knees - - - -@cindex @code{]} - -In some cases it may be necessary to override LilyPond's automatic -beaming algorithm. For example, the auto beamer will not beam over -rests, so if you want that, specify the begin and end point manually -using @code{[} and @code{]}: - -@quotation -@lilypond[fragment,relative,verbatim] - \context Staff { - r4 [r8 g'' a] - } -@end lilypond -@end quotation - -Similarly, for beams over bar lines: - -@quotation -@lilypond[fragment,relative,verbatim] - \context Staff { - a''8 r a2 r8 [a a] - } -@end lilypond -@end quotation -@cindex @code{stemLeftBeamCount} - -If you have specific wishes for the number of beams, you can fully -control the number of beams through the properties -@code{Voice.stemLeftBeamCount}; - -@quotation -@lilypond[fragment,relative,verbatim] - \context Staff { - [f'8 r16 f g a] - [f8 r16 \property Voice.stemLeftBeamCount = #1 f g a] - } -@end lilypond -@end quotation -@cindex @code{stemRightBeamCount} - -and @code{Voice.stemRightBeamCount}: - -@quotation -@lilypond[fragment,relative,verbatim] - f'32 g a b b a g f - - \property Voice.autoBeamSettings - \set #'(end * * * *) = #(make-moment 1 4) - f32 g a b b a g f - - f32 g a - \property Voice.stemRightBeamCount = #1 b - \property Voice.stemLeftBeamCount = #1 b - a g f -@end lilypond -@end quotation @cindex @code{no-stem-extend} Conventionally, stems and beams extend to the middle staff line. This @@ -209,94 +146,6 @@ your favourite algorithm isn't one of these, you can hook up your own. -@node Slur attachments -@section Slur attachments - -The ending of a slur should whenever possible be attached to a note -head. Only in some instances where beams are involved, LilyPond may -attach a slur to a stem end. In some cases, you may want to override -LilyPond's decision, e.g., to attach the slur to the stem end. This can -be done through @code{Voice.Slur}'s grob-property @code{attachment}: -@c FIXME: make @ref{} to backend doco - -@quotation -@lilypond[fragment,relative,verbatim] - \property Voice.Slur \set #'direction = #1 - \property Voice.Stem \set #'length = #5.5 - g''8(g)g4 - \property Voice.Slur \set #'attachment = #'(stem . stem) - g8(g)g4 -@end lilypond -@end quotation - -Similarly, slurs can be attached to note heads even when beams are -involved: - -@quotation -@lilypond[fragment,relative,verbatim] - \property Voice.Slur \set #'direction = #1 - \property Voice.Slur \set #'attachment = #'(head . head) - g''16()g()g()g()d'()d()d()d -@end lilypond -@end quotation - -If a slur would strike through a stem or beam, LilyPond will move the -slur away vertically (upward or downward). In some cases, this may -cause ugly slurs that you may want to correct: - -@quotation -@lilypond[fragment,relative,verbatim] - \property Voice.Stem \set #'direction = #1 - \property Voice.Slur \set #'direction = #1 - d'32( d'4 )d8.. - \property Voice.Slur \set #'attachment = #'(stem . stem) - d,32( d'4 )d8.. -@end lilypond -@end quotation - -LilyPond will increase the curvature of a slur trying to stay free of -note heads and stems. However, if the curvature would increase too much, -the slur will be reverted to its default shape. This decision is based -on @code{Voice.Slur}'s grob-property @code{beautiful} value. In some -cases, you may find ugly slurs beautiful, and tell LilyPond so by -increasing the @code{beautiful} value: - -[hoe gedefd?? wat betekent beautiful = X?] - -@quotation -@lilypond[verbatim] -\score { - \notes \context PianoStaff < - \time 6/4; - \context Staff=up { s1 * 6/4 } - \context Staff=down < - \clef bass; - \autochange Staff \context Voice - \notes \relative c { - d,8( a' d f a d f d a f d )a - } - > - > - \paper { - linewidth = -1.; - \translator { - \VoiceContext - Slur \override #'beautiful = #5.0 - Slur \override #'direction = #1 - Stem \override #'direction = #-1 - autoBeamSettings \override #'(end * * * *) - = #(make-moment 1 2) - } - \translator { - \PianoStaffContext - VerticalAlignment \override #'threshold = #'(5 . 5) - } - } -} -@end lilypond -@end quotation - - @node Engraver hacking @section Engraver hacking @@ -416,32 +265,6 @@ Metrome hack... @end lilypond -@node Output property -@section Output property - -@lilypond[fragment,relative,verbatim] - \outputproperty #(make-type-checker 'note-head-interface) - #'extra-offset = #'(2 . 3) - c''2 c -@end lilypond - -Don't move the finger 2, only text "m.d." ... -@lilypond[verbatim] -#(define (make-text-checker text) - (lambda (grob) (equal? text (ly-get-elt-property grob 'text)))) - -\score { - \notes\relative c''' { - \property Voice.Stem \set #'direction = #1 - \outputproperty #(make-text-checker "m.d.") - #'extra-offset = #'(-3.5 . -4.5) - a^2^"m.d." - } - \paper { linewidth = -1.; } -} -@end lilypond - - @c equalizer @@ -499,15 +322,3 @@ Arbitrary lines and curves not supported... \paper { linewidth = 70 * \staffspace; } } @end lilypond - -@ignore -@node Index -@section Checking Feature index - -@printindex cp - - -@bye -@end ignore - - diff --git a/Documentation/user/tutorial.itely b/Documentation/user/tutorial.itely index 06ec229749..c86ccfae3d 100644 --- a/Documentation/user/tutorial.itely +++ b/Documentation/user/tutorial.itely @@ -9,7 +9,7 @@ * The first tune:: The first tune * Lyrics and chords:: Lyrics and chords * More movements:: More than one movement in a file -* Piano music:: Piano music +* A piano excerpt:: Piano music * end of tutorial:: The end @end menu @@ -1086,8 +1086,8 @@ will be at the left. -@node Piano music -@section Piano music +@node A piano excerpt +@section A piano excerpt Our third subject is a piece of piano music. The fragment in the input file is a piano reduction of the G major Sinfonia by Giovanni Battista diff --git a/VERSION b/VERSION index 48b1e42c11..65caf5f0ed 100644 --- a/VERSION +++ b/VERSION @@ -1,8 +1,8 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 -PATCH_LEVEL=127 -MY_PATCH_LEVEL=jcn4 +PATCH_LEVEL=128 +MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/input/bugs/textstyle.ly b/input/bugs/textstyle.ly new file mode 100644 index 0000000000..a015574434 --- /dev/null +++ b/input/bugs/textstyle.ly @@ -0,0 +1,4 @@ + +\score { \notes + { c4_"foo" } +} diff --git a/input/test/coriolan-margin.ly b/input/test/coriolan-margin.ly index 26bd470d44..7cfbd25c48 100644 --- a/input/test/coriolan-margin.ly +++ b/input/test/coriolan-margin.ly @@ -1,3 +1,4 @@ +\version "1.3.122" #(define raisedflat '((raise . 0.4) (music (named "accidentals--1")))) diff --git a/input/test/mark.ly b/input/test/mark.ly index f037d10dde..0222093bf1 100644 --- a/input/test/mark.ly +++ b/input/test/mark.ly @@ -4,12 +4,14 @@ global = \notes { s1 | \mark "A"; s1 | \mark ; s1 | \mark "12"; + s1 | \mark ; s1 | \mark "A2"; + s1 | \mark #'(music "scripts-segno") ; s1 } one = \notes \relative c { - c''1 c c c c + c''1 c c c c c c } diff --git a/input/test/orchestscore.ly b/input/test/orchestscore.ly index be3360d573..06a8b1acf8 100644 --- a/input/test/orchestscore.ly +++ b/input/test/orchestscore.ly @@ -1,4 +1,8 @@ -\version "1.3.120"; +\header{ + latexpackages="graphicx"; +} + +\version "1.3.126"; m = \notes \relative c''{ @@ -13,7 +17,7 @@ c1 | c2 c | c c | R1*5 \score{ < \context StaffGroup = wood < \context Staff = flauto < - \property Staff.instrument = "Flauto" + \property Staff.instrument = "\\rotatebox[origin=c]{90}{Flauto}" \property Staff.instr = "Fl." \m > @@ -97,7 +101,7 @@ c1 | c2 c | c c | R1*5 \OrchestralScoreContext skipBars = ##t markScriptPadding = #4.0 - BarNumber \override $'padding = #3 + BarNumber \override #'padding = #3 RestCollision \override #'maximum-rest-count = #1 marginScriptHorizontalAlignment = #1 } diff --git a/input/tutorial/menuet.ly b/input/tutorial/menuet.ly index fb7f564a34..a1eb48cb46 100644 --- a/input/tutorial/menuet.ly +++ b/input/tutorial/menuet.ly @@ -4,7 +4,7 @@ \notes \relative c'' \sequential { - \key g; + \key g \major; \time 3/4; \repeat "volta" 2 \sequential { diff --git a/input/tutorial/orchestral.ly b/input/tutorial/orchestral.ly deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lily/chord-tremolo-engraver.cc b/lily/chord-tremolo-engraver.cc index 496baacbd0..e990addf9b 100644 --- a/lily/chord-tremolo-engraver.cc +++ b/lily/chord-tremolo-engraver.cc @@ -20,6 +20,8 @@ #include "spanner.hh" #include "item.hh" #include "chord-tremolo-iterator.hh" +#include "stem-tremolo.hh" +#include "music-list.hh" /** This acknowledges repeated music with "tremolo" style. It typesets @@ -52,17 +54,18 @@ protected: Moment beam_start_location_; int note_head_i_; - + + bool sequential_body_b_; Spanner * beam_p_; Spanner * finished_beam_p_; - + Item * stem_tremolo_; protected: virtual void finalize(); virtual bool try_music (Music*); virtual void acknowledge_grob (Grob_info); virtual void stop_translation_timestep(); virtual void start_translation_timestep(); - virtual void create_grobs (); + virtual void process_music (); }; Chord_tremolo_engraver::Chord_tremolo_engraver() @@ -70,6 +73,8 @@ Chord_tremolo_engraver::Chord_tremolo_engraver() beam_p_ = finished_beam_p_ = 0; repeat_ =0; note_head_i_ = 0; + stem_tremolo_ = 0; + sequential_body_b_ = false; } bool @@ -84,32 +89,50 @@ Chord_tremolo_engraver::try_music (Music * m) repeat_ = rp; start_mom_ = now_mom (); stop_mom_ = start_mom_ + l; + sequential_body_b_ = dynamic_cast (rp->body ()); // ugh. should generate dots, triplet beams. note_head_i_ = l.den () set_grob_property ("chord-tremolo", SCM_BOOL_T); + if (sequential_body_b_ && !beam_p_) + { + beam_p_ = new Spanner (get_property ("Beam")); + Beam::set_interface (beam_p_); + beam_p_->set_grob_property ("chord-tremolo", SCM_BOOL_T); - SCM smp = get_property ("measurePosition"); - Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); - beam_start_location_ = mp; - announce_grob (beam_p_, repeat_); - } -} + SCM smp = get_property ("measurePosition"); + Moment mp + = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); + beam_start_location_ = mp; + announce_grob (beam_p_, repeat_); + } + else if (!sequential_body_b_ && !stem_tremolo_) + { + int flags = intlog2(note_head_i_ * repeat_->repeat_count ()) -2; + if (flags) + { + stem_tremolo_ = new Item (get_property ("StemTremolo")); + Stem_tremolo::set_interface (stem_tremolo_); + announce_grob (stem_tremolo_, repeat_); + stem_tremolo_->set_grob_property ("tremolo-flags", + gh_int2scm (flags)); + } + } + } +} void Chord_tremolo_engraver::finalize () { @@ -117,12 +140,7 @@ Chord_tremolo_engraver::finalize () if (beam_p_) { repeat_->origin ()->warning (_ ("unterminated chord tremolo")); -#if 0 - finished_beam_p_ = beam_p_; - typeset_beam (); -#else beam_p_->suicide (); -#endif } } @@ -182,10 +200,18 @@ Chord_tremolo_engraver::acknowledge_grob (Grob_info info) ::warning (s); } } - if (Note_head::has_interface (info.elem_l_)) - { - info.elem_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_))); - } + } + else if (stem_tremolo_ && Stem::has_interface (info.elem_l_)) + { + Stem_tremolo::set_stem (stem_tremolo_, info.elem_l_); + + info.elem_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_))); + } + + + if (repeat_ && Note_head::has_interface (info.elem_l_)) + { + info.elem_l_->set_grob_property ("duration-log", gh_int2scm (intlog2 (note_head_i_))); } } @@ -207,6 +233,13 @@ void Chord_tremolo_engraver::stop_translation_timestep () { typeset_beam (); + + if (stem_tremolo_) + { + typeset_grob (stem_tremolo_); + stem_tremolo_ = 0; + } + } ADD_THIS_TRANSLATOR(Chord_tremolo_engraver); diff --git a/lily/lily-guile.cc b/lily/lily-guile.cc index 4e5f166ad2..d467a59e82 100644 --- a/lily/lily-guile.cc +++ b/lily/lily-guile.cc @@ -430,7 +430,7 @@ static void init_functions () { scm_make_gsubr ("ly-warn", 1, 0, 0, (Scheme_function_unknown)ly_warning); - scm_make_gsubr ("ly-version", 0, 0, 0, (Scheme_function_unknown)ly_warning); + scm_make_gsubr ("ly-version", 0, 0, 0, (Scheme_function_unknown)ly_version); scm_make_gsubr ("ly-gulp-file", 1,0, 0, (Scheme_function_unknown)ly_gulp_file); scm_make_gsubr ("dir?", 1,0, 0, (Scheme_function_unknown)ly_isdir_p); diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 4e8f1725dd..42dcb87513 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -149,51 +149,56 @@ Mark_engraver::create_grobs () */ SCM m = mark_req_l_->get_mus_property ("label"); - if (!gh_string_p (m)) - m = get_property ("rehearsalMark"); -; - - if (gh_number_p (m)) - { - int mark_count = gh_scm2int (m); - t = to_str (mark_count); - mark_count ++; - m = gh_int2scm (mark_count); - } - else if (gh_string_p (m)) + if (gh_pair_p (m)) // markup text + text_p_->set_grob_property ("text",m); + else { - t = ly_scm2string (m); - String next; - if (t.length_i ()) + if (!gh_string_p (m)) + m = get_property ("rehearsalMark"); + ; + + if (gh_number_p (m)) { - char c = t[0]; - c++; - next = to_str (c); + int mark_count = gh_scm2int (m); + t = to_str (mark_count); + mark_count ++; + m = gh_int2scm (mark_count); + } + else if (gh_string_p (m)) + { + t = ly_scm2string (m); + String next; + if (t.length_i ()) + { + char c = t[0]; + c++; + next = to_str (c); + } + m = ly_str02scm (next.ch_C()); + } + else + { + m = gh_int2scm (1); } - m = ly_str02scm (next.ch_C()); - } - else - { - m = gh_int2scm (1); - } - daddy_trans_l_->set_property ("rehearsalMark", m); - - - text_p_->set_grob_property ("text", - ly_str02scm ( t.ch_C())); + daddy_trans_l_->set_property ("rehearsalMark", m); + + text_p_->set_grob_property ("text", + ly_str02scm ( t.ch_C())); - String style = "mark"; - for (int i=0; i < t.length_i(); i++) - { - if (!isdigit(t[i])) + String style = "mark"; + for (int i=0; i < t.length_i(); i++) { - style = "large"; - break; + if (!isdigit(t[i])) + { + style = "large"; + break; + } } + SCM st = ly_symbol2scm (style.ch_C()); + text_p_->set_grob_property ("font-style", st); } - SCM st = ly_symbol2scm (style.ch_C()); - text_p_->set_grob_property ("font-style", st); + } } diff --git a/lily/moment.cc b/lily/moment.cc index 9b3080f12d..cc0f2dd25d 100644 --- a/lily/moment.cc +++ b/lily/moment.cc @@ -45,6 +45,9 @@ Moment::print_smob (SCM s, SCM port, scm_print_state *) return 1; } +/* + TODO: add optional factor argument. + */ SCM make_rational (SCM n, SCM d) { diff --git a/lily/parser.yy b/lily/parser.yy index cc62753a21..a49098a006 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -735,12 +735,12 @@ Simple_music: THIS->parser_error (_("First argument must be a procedure taking 1 argument")); } - Music *m = new Music (SCM_EOL); - m->set_mus_property ("predicate", pred); - m->set_mus_property ("symbol", $3); - m->set_mus_property ("value", $5); - m->set_mus_property ("iterator-ctor", - Output_property_music_iterator::constructor_cxx_function); + Music *m = new Music (SCM_EOL); + m->set_mus_property ("predicate", pred); + m->set_mus_property ("symbol", $3); + m->set_mus_property ("value", $5); + m->set_mus_property ("iterator-ctor", + Output_property_music_iterator::constructor_cxx_function); $$ = m; } @@ -1149,17 +1149,12 @@ verbose_command_req: Mark_req * m = new Mark_req; $$ = m; } - | MARK STRING { + | MARK scalar { Mark_req *m = new Mark_req; m->set_mus_property ("label", $2); $$ = m; } - | MARK bare_unsigned { - Mark_req *m = new Mark_req; - m->set_mus_property ("label", gh_int2scm ($2)); - $$ = m; - } | PENALTY bare_int { Break_req * b = new Break_req; b->set_mus_property ("penalty", gh_double2scm ( $2 / 100.0)); @@ -1256,12 +1251,13 @@ verbose_request: sp_p->set_spot (THIS->here_input ()); $$ = sp_p; } - | tremolo_type { - Tremolo_req* a = new Tremolo_req; - a->set_spot (THIS->here_input ()); - a->set_mus_property ("tremolo-type", gh_int2scm ($1)); - $$ = a; - } + | tremolo_type { + Tremolo_req* a = new Tremolo_req; + a->set_spot (THIS->here_input ()); + a->set_mus_property ("tremolo-type", gh_int2scm ($1)); + $$ = a; + } + | SCRIPT STRING { Articulation_req * a = new Articulation_req; a->set_mus_property ("articulation-type", $2); diff --git a/lily/side-position-interface.cc b/lily/side-position-interface.cc index b1d3923d3f..1fa32c04ba 100644 --- a/lily/side-position-interface.cc +++ b/lily/side-position-interface.cc @@ -172,7 +172,7 @@ Side_position::quantised_position (SCM element_smob, SCM ) Real rad = Staff_symbol_referencer::staff_radius (me) *2 ; int ip = int (rp); - if (abs (ip) < rad && Staff_symbol_referencer::on_staffline (me,ip)) + if (abs (ip) <= rad && Staff_symbol_referencer::on_staffline (me,ip)) { ip += d; rp += d; diff --git a/lily/stem-engraver.cc b/lily/stem-engraver.cc index f5f9546c4c..f49da3e650 100644 --- a/lily/stem-engraver.cc +++ b/lily/stem-engraver.cc @@ -146,7 +146,6 @@ Stem_engraver::stop_translation_timestep() // UGH. Should mark non-forced instead. - /* aargh: I don't get it. direction is being set (and then set to forced), if we have a Chord_tremolo. diff --git a/lily/stem-tremolo-engraver.cc b/lily/stem-tremolo-engraver.cc new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/lily/stem-tremolo-engraver.cc @@ -0,0 +1 @@ + diff --git a/ly/engraver.ly b/ly/engraver.ly index e3db961cee..66664f7d28 100644 --- a/ly/engraver.ly +++ b/ly/engraver.ly @@ -292,12 +292,6 @@ ChordNamesContext = \translator { } -ScoreWithNumbers = \translator { - \type "Score_engraver"; - - % uncomment to bar numbers on a whole system. - \consists "Bar_number_engraver"; -} StupidScore = \translator { \type "Score_engraver"; @@ -307,10 +301,6 @@ StupidScore = \translator { -BarNumberingStaffContext = \translator { - \StaffContext - \consists "Mark_engraver"; -} HaraKiriStaffContext = \translator { \StaffContext @@ -326,10 +316,8 @@ HaraKiriStaffContext = \translator { %\translator { \HaraKiriStaffContext } %} -OrchestralPartStaffContext = \translator { - \StaffContext - \consists "Mark_engraver"; -} + + ScoreContext = \translator { \type Score_engraver; diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index d893a866dc..77eb380812 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,15 +1,15 @@ Begin3 Title: LilyPond -Version: 1.3.127 -Entered-date: 31JAN01 +Version: 1.3.128 +Entered-date: 05FEB01 Description: Keywords: music notation typesetting midi fonts engraving Author: hanwen@cs.uu.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 1000k lilypond-1.3.127.tar.gz + 1000k lilypond-1.3.128.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.3.127.tar.gz + 1000k lilypond-1.3.128.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index fd768c6b3d..3f5d684297 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,11 +1,11 @@ %define info yes Name: lilypond -Version: 1.3.127 +Version: 1.3.128 Release: 1 License: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.127.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.128.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond # Icon: lilypond-icon.gif diff --git a/scripts/ly2dvi.py b/scripts/ly2dvi.py index 704efe84ee..165e63b142 100644 --- a/scripts/ly2dvi.py +++ b/scripts/ly2dvi.py @@ -7,7 +7,7 @@ # * (c) on page 1 # * more helpful info on lily crashes # * Should use files in /tmp/ only. This potentially messes with -# usergenerated files in the CWD +# user generated files in the CWD """ @@ -25,8 +25,6 @@ Output: DVI file name = 'ly2dvi' version = '@TOPLEVEL_VERSION@' -if version == '@' + 'TOPLEVEL_VERSION' + '@': - version = '(unknown version)' # uGUHGUHGHGUGH errorlog = '' import sys @@ -147,6 +145,7 @@ class Input: # ------ ---------- ( 'language', Props.setLanguage ), ( 'latexheaders', Props.setHeader ), + ( 'latexpackages', Props.setPackages ), ( 'paperorientation', Props.setOrientation ), ( 'paperpapersize', Props.setPaperZize ), ( 'papertextheight', Props.setTextHeight ), @@ -261,7 +260,6 @@ class TeXOutput: \usepackage[latin1]{inputenc} %%\usepackage[T1]{fontenc} %% -%s %% don not waste unused space at bottom of page %% (unless we have footnotes ...) %%\headheight9pt @@ -276,10 +274,11 @@ class TeXOutput: %% UGR. %%\renewcommand{\@evenhead}{eve!{\small\lilypondinstrument{,}\quad\textbf{\thepage}}\hfil}%% \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%% +%s \begin{document} """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'), - Props.get('language'), Props.get('pagenumber'), Props.get('linewidth'), - textheightsetting, Props.get('orientation'), Props.get('header') ) + Props.get('language'), Props.get('linewidth'), textheightsetting, + Props.get('orientation'), Props.get('header'), Props.get('pagenumber')) base, ext = os.path.splitext(file) this.__base = base @@ -574,6 +573,7 @@ class Properties: ( 'KEEPLY2DVI', this.setKeeply2dvi ), ( 'LANGUAGE', this.setLanguage ), ( 'LATEXHF', this.setHeader ), + ( 'LATEXPKG', this.setPackages ), ( 'LILYINCLUDE', this.setInclude ), ( 'LILYPONDPREFIX', this.setRoot ), ( 'NONUMBER', this.setNonumber ), @@ -822,7 +822,13 @@ class Properties: # Set latex header name # def setHeader(this,head, requester): - this.__set('header','\\input{' + head + '}',requester) + this.__set('header','\\input{' + head + '}'+this.get('header'),requester) + + # + # Set latex package name + # + def setPackages(this,pkgs, requester): + this.__set('header','\\usepackage{' + pkgs + '}'+this.get('header'),requester) # # Set or Clear Dependencies flag to generate makefile dependencies