]> git.donarmstrong.com Git - lilypond.git/commitdiff
release: 1.3.132 release/1.3.132
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 25 Feb 2001 22:58:52 +0000 (23:58 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 25 Feb 2001 22:58:52 +0000 (23:58 +0100)
============

* Fixes for ascii-script output.  Stylesheet needs some work, just as
PostScript output.

* Bugfix: convert-ly --to accepts argument.

* Prepared Petites Preludes for (first?) submission to mutopia.

* Bugfix: out-letter/%.ps generation for mutopia.

* Bugfix: don't use $(message ) in makefiles; some versions of make
choke on this.

* Bugfix: ly2dvi.py: don't add magic `//' to TEXINPUTS,MFINPUTS; this
chokes kpsewhich 3.3.1 (bug report filed).

* Bugfix: file-path.cc: don't interpret relative path as system root.

* Bugfix: --srcdir install.

1.3.131.h

30 files changed:
CHANGES
Documentation/user/convertors.itely
Documentation/user/invoking.itexi
Documentation/user/literature.itely
Documentation/user/ly2dvi.itexi
Documentation/user/refman.itely
Documentation/user/tutorial.itely
VERSION
buildscripts/mutopia-index.py
configure
input/bugs/grace-dynamic.ly [new file with mode: 0644]
input/bugs/ss.ly [deleted file]
input/regression/lyrics-multi-stanza.ly
lily/align-interface.cc
lily/break-align-engraver.cc
lily/break-align-item.cc
lily/dynamic-engraver.cc
lily/include/align-interface.hh
lily/parser.yy
lily/stem.cc
make/out/lilypond.lsm
make/out/lilypond.spec
mutopia/Coriolan/clarinetti.ly
mutopia/Coriolan/corni.ly
scm/grob-description.scm
scm/grob-property-description.scm
scm/interface-description.scm
scm/translator-description.scm
scm/translator-property-description.scm
stepmake/configure

diff --git a/CHANGES b/CHANGES
index 281ffa35d8383d1eab7a04bfb5060b9864ec13c1..91841f2b9a14c45365e10e06f37ac1a492e3052a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -8,9 +8,6 @@ PostScript output.
 
 * Prepared Petites Preludes for (first?) submission to mutopia.
 
-1.3.131.jcn1
-============
-
 * Bugfix: out-letter/%.ps generation for mutopia.
 
 * Bugfix: don't use $(message ) in makefiles; some versions of make
@@ -23,6 +20,28 @@ chokes kpsewhich 3.3.1 (bug report filed).
 
 * Bugfix: --srcdir install.
 
+1.3.131.hwn1
+============
+
+* Documentation: piano pedals, breath marks, tutorial fixes,
+convertors, autochange, \override/\set/\revert, multi-stanza lyrics,
+\outputproperty
+
+* Bugfix: another fix for collapsing dynamics with partcombine.
+
+* Bugfix: add functionality of
+Side_position_interface::self_align_callback() into
+Align_interface::align_elements_to_extents(). Otherwise, combining
+both (such as in a break alignment) leads to weird behavior: the
+spacing information is written halfway during a callback sequence,
+leading to weird results.
+
+This fixes input/test/orchestscore.ly
+
+* Bugfix: x-offset of stem was off by 0.5 stem thickness.
+
+* Add grob-property attachment-angle: angle for stem to attach to note head. 
+
 1.3.130.hwn2
 ============
 
index 92848556d9e9a2c1cf3e3de9cf37e7f9445d6bb2..81174826e37369cadde0a698cb3d86619ec76b8e 100644 (file)
@@ -3,21 +3,37 @@
 @node Conversion tools
 @chapter Converting to LilyPond format.
 
-@section midi2ly
 
-Midi2ly translates a MIDI input file to a LilyPond source file.
-Midi2ly is part of the GNU LilyPond music typesetting package.
+@menu
+* midi2ly::                     
+* etf2ly::                      
+* abc2ly::                      
+* pmx2ly::                      
+* musedata2ly::                 
+@end menu
+
+@node midi2ly
+@section midi2ly
 
+Midi2ly translates a MIDI input file to a LilyPond source file. MIDI
+(Music Instrument Digital Interface) is a standard for digital
+instruments: it specifies cabling, a serial protocol and a file format.
 
-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.
+It is possible to record a MIDI file using a digital keyboard, and then
+convert it to @file{.ly}. However, human players can not rhythmically
+exact enough to make a MIDI to .ly conversion trivial.  midi2ly tries to
+compensate for these timing 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.
 
+MIDI is also a de facto standard format for exporting music from other
+programs, so this capability may come in useful when you want to import
+files from a program that has no convertor for its native format.
+
 @subsection Invoking midi2ly
 
 @example
@@ -56,13 +72,16 @@ robust midi2ly.
     Assume no double dotted notes.
 @end table
 
-
+@node etf2ly
 @section etf2ly
 
-@subsection Invoking etf2ly
-Usage:
 
+ETF (Enigma Transport Format) is a format used by Coda Music
+Technology's Finale product. This program will convert part of an ETF
+file to a ready-to-use lilypond file.
 
+@subsection Invoking etf2ly
+Usage:
 
 @example
         etf2ly [OPTION]... ETF-FILE
@@ -80,13 +99,108 @@ set output filename to FILE
 version information
 @end table
 
-Enigma Transport Format is a format used by Coda Music Technology's
-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
+Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
+
+
+@subsection Bugs
+
+Known: articulation scripts are buggy.  Empty measures confuse etf2ly.
+Report bugs to @email{bug-gnu-music@@gnu.org}.
+
+@node abc2ly
+@section abc2ly
+
+ABC is a fairly simple ASCII based format. It is described at
+@uref{http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt}.
+
+
+@example
+        abc2ly [OPTION]... ABC-FILE
+@end example
+
+Convert ABC to LilyPond.
+
+Options:
+@table @code
+@item   -h,--help
+this help
+@item  -o,--output=FILE
+set output filename to FILE
+@item  -v,--version
+version information
+@end table
+
+@subsection Bugs
+
+The ABC standard is not very "standard". For extended features
+(eg. polyphonic music) different conventions exist. 
+
+[TODO: describe limitations]
+
+
+@node pmx2ly
+@section pmx2ly
+
+PMX is a Musixtex preprocessor written by Don Simons, see
+@uref{http://www.gmd.de/Misc/Music/musixtex/software/pmx/}.
+
+Report bugs to @email{bug-gnu-music@@gnu.org}.
+
+@example
+        pmx2ly [OPTION]... PMX-FILE
+@end example
+
+Convert PMX to LilyPond.
+
+Options:
+@table @code
+@item   -h,--help
+this help
+@item  -o,--output=FILE
+set output filename to FILE
+@item  -v,--version
+version information
+@end table
+
+
+@node musedata2ly
+@section musedata2ly
+
+PMX is a Musixtex preprocessor written by Don Simons, see
+@uref{http://www.gmd.de/Misc/Music/musixtex/software/pmx/}.
+
+Report bugs to @email{bug-gnu-music@@gnu.org}.
+
+@example
+        musedata2ly [OPTION]... MUSEDATA-FILE
+@end example
+
+Convert Musedata to LilyPond. Musedata (@uref{http://www.musedata.org/})
+is an electronic library of classical music scores, currently comprising
+about 800 composition dating from 1700 to 1825.  The music is encoded in
+so-called Musedata format
+(@uref{http://www.ccarh.org/publications/books/beyondmidi/online/musedata}).
+musedata2ly converts a set of musedata files to one .ly file, and will
+include a \header field if a .ref file is supplied
+
+Report bugs to @email{bug-gnu-music@@gnu.org}.
+
+Written by @email{Han-Wen Nienhuys,hanwen@@cs.uu.nl}.
+
+
+Options:
+@table @code
+@item   -h,--help
+this help
+@item  -o,--output=@var{file}
+set output filename to @var{file}
+@item  -v,--version
+version information
+@item  -r,--ref=@var{reffile}
+ read background information from ref-file
+@var{REFFILE}
+@end table
 
-Written by  Han-Wen Nienhuys
 
-[descibe abc2ly, pmx2ly, etf2ly, musedata2ly here]
 
index e5e8dd30e678edf5f39f8f926eab066b86714092..96f19453cbf239f490a1be02eee9acb04a690fbd 100644 (file)
@@ -21,9 +21,9 @@ dump).
 
 For processing both the @TeX{} and the PostScript output, you must
 have appropriate environment variables set.  For @TeX{}, you have to
-set @var{MFINPUTS} and @var{TEXINPUTS} to point to the directory
+set @code{MFINPUTS} and @code{TEXINPUTS} to point to the directory
 containing LilyPond metafont and .tex files.  For processing the
-PostScript with Ghostscript, you have to set @var{GS_FONTPATH} to
+PostScript with Ghostscript, you have to set @code{GS_FONTPATH} to
 point to the directory containing LilyPond @file{pfa} files.
 
 Scripts to do this are included in
index 86629ec9b139ec7d29226a7f005fac45e3e21391..0140a5e529017e2509a8d60bc15796053cdd0270 100644 (file)
@@ -19,11 +19,7 @@ Tom Gerou and Linda Lusk, Essential Dictionary of Music
 Notation.  Alfred Publishing, Van Nuys CA ISBN 0-88284-768-6
 
 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.]
-
+(notation) issues which covers most of the normal  cases.
 
 @item Stone80
 
@@ -38,8 +34,7 @@ overview of existing traditional notation practices.
 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.
+A standard work on music notation.  
 
 @item hader48,
 
index 8b7bddfd71016c8b1253b49aaf88f26b54781d2f..3c54dbd2f0a74c3a438440688f6d6f57aad702e1 100644 (file)
@@ -218,17 +218,8 @@ a list of priorities for lowest to hightest proirity.
 
 @subsection  Bugs
 
-See @ref{Bug reports}.  If you have found a bug, you should send a
-bugreport.
-
-@itemize @bullet
-@item Send a copy of the input which causes the error.
-@item Send a description of the platform you use.
-@item Send a description of the LilyPond and ly2dvi version you use.
-@item Send a description of the bug itself.
-@item Send it to @email{bug-gnu-music@@gnu.org} (you don't have to subscribe
-    to this mailinglist).
-@end itemize
+If find something that you consider a bug, please send a bugreport (See
+@ref{Bug reports}) to @email{bug-gnu-music@@gnu.org}.
 
 @subsection  Remarks
 
index 4a8652b6f52ee5185c1e94ba91cfb32261d5d5a7..f882840e7e156773922c4a002156b0fe11474d03 100644 (file)
 
    Rhythm staff (clef, x-notehead)
 
-   postscript, scheme output?
-
-   (links to?) using/existance of ly2dvi, lilypond-book
-
 @end ignore
 
 
 @chapter Reference Manual
 
 This document describes GNU LilyPond and its input format. This document
-has been revised for LilyPond 1.3.125
+has been revised for LilyPond 1.3.131
 
 
 
 @menu
 * Overview::                    
-* Repeats::                     
 * Note entry::                  
 * Music notation::              
 * Polyphony::                   
 * Spanners::                    
+* Repeats::                     
 * Piano music::                 
 * Lyrics::                      
 * Chords::                      
 * Writing parts::               
 * Custodes::                    
+* Tuning output::               
 * Page layout::                 
 * Sound::                       
 * Music entry::                 
 * Engravers::                   
 * Syntactic details::           
-* Unsorted::                    
 @end menu
 
 @c . {Overview}
@@ -114,196 +110,6 @@ can enter and edit them in manageable chunks.
 
 
 
-@c .  {Repeats}
-@node Repeats
-@section Repeats
-
-
-@cindex repeats
-@cindex @code{\repeat}
-
-In order to specify repeats, use the @code{\repeat}
-keyword.  Since repeats look and sound differently when played or
-printed, there are a few different variants of repeats.
-
-@table @asis
-@item unfolded  
-Repeated music is fully written (played) out.  Useful for MIDI
-output.
-
-@item volta  
-This is the normal notation: Repeats are not written out, but
-alternative endings (voltas) are printed, left to right.
-
-@item folded  
-Alternative endings are written stacked.  Which is unfortunately not
-practical for anything right now.
-
-@item tremolo
-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
-  \repeat @var{variant} @var{repeatcount} @var{repeatbody}
-@end example
-
-If you have alternative endings, you may add
-
-@cindex @code{\alternative}
-@example
- \alternative @code{@{} @var{alternative1}
-            @var{alternative2}
-            @var{alternative3} @dots{} @code{@}}
-@end example
-
-where each @var{alternative} is a Music expression.
-
-Normal notation repeats are used like this:
-
-@quotation
-
-@lilypond[fragment,verbatim]
-  c'1
-  \repeat volta 2 { c'4 d' e' f' }
-  \repeat volta 2 { f' e' d' c' }
-@end lilypond
-@end quotation
-
-With alternative endings:
-
-@quotation
-
-@lilypond[fragment,verbatim]
-  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 at some point in the future.}
-
-@quotation
-
-@lilypond[fragment,verbatim]
-  c'1
-  \repeat fold 2 {c'4 d' e' f'} 
-  \alternative { {d'2 d'} {f' f} }
-
-@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
-the specified number of repeats.
-
-@quotation
-@lilypond[fragment,verbatim]
-\context Staff {
-  \relative c' {
-    \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, so you have to reset timing information
-after a repeat, eg using bar-checks, @code{Score.measurePosition} or
-@code{\partial}. We hope to fix this after 1.4.
-
-It is possible to nest @code{\repeat}, although it probably is only
-meaningful for unfolded repeats.
-
-@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 . @var{text})
-  Print a volta bracket saying @var{text}.
-@item (volta . #f)
-  Stop a running volta bracket
-@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 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" 4 c16
-  }
-  \paper {
-    linewidth = 40*\staffspace;
-  }  
-}
-@end lilypond
-
-@node Tremolo subdivision
-@subsection Tremolo subdivision
-@cindex tremolo marks
-@cindex @code{tremoloFlags}
-
-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
-
-Tremolos in this style do not carry over into the MIDI output.
-
-Using this mechanism pays off when you entering many tremolos, since the
-default argument saves a lot of typing.
-
-
 @c . {Note entry}
 @node Note entry
 @section Note entry
@@ -485,8 +291,9 @@ r1 r2 r4 r8 r16 r32 r64 r64
 @end lilypond
 @end quotation
 
-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].
+As you can see, the longa is not printed. To get a longa note head, you
+have to use a mensural note heads. This is done accomplished by setting
+the @code{style} property of the NoteHead grob to @code{mensural}.
 
 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
@@ -566,6 +373,7 @@ this has the same effect as the spacer rest.
 @cindex Music notation
 @menu
 * Key::                         
+* Breath marks::                
 * Time signature::              
 @end menu
 
@@ -637,8 +445,6 @@ Supported clef-names include
 @item percussion: percussion clef
 @end itemize
 
-[todo: ancient clefs]
-
 Supported associated symbols (for Staff.clefGlyph) are:
 
 @itemize @bullet
@@ -666,6 +472,17 @@ Supported associated symbols (for Staff.clefGlyph) are:
 historic editions".  @emph{Editio XXX style} means "as is/was printed in
 Editio XXX".
 
+@node Breath marks
+@subsection Breath marks
+
+Breath marks are entered using @code{\breathe}:
+
+@lilypond[fragment,relative]
+c'4 \breathe d4
+@end lilypond
+
+
+
 @c .  {Time signature}
 @node Time signature
 @subsection Time signature
@@ -708,6 +525,9 @@ Short cut for
 See the documentation of @code{measurePosition}.
 
 
+
+
+
 @c .   {Polyphony}
 @node Polyphony
 @section Polyphony
@@ -998,6 +818,8 @@ note in the phrasing slur.
   \time 6/4; c''\((d)e f(e)\)d
 @end lilypond
 
+[TODO: put together with breath mark.]
+
 
 @c .   {Tie}
 @menu
@@ -1095,12 +917,13 @@ their written length:
 
 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}.  [FIXME: many more] This
-is an internal command.  Users should use the shorthands which are
-defined in the initialization file @file{spanners.ly}.
+describes what should be started.  Among the 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}.
 
-You can attach a (general) span request to a note using
+You can attach a (general) span request to a note using the following
+syntax.
 
 @lilypond[fragment,verbatim,center]
   c'4-\spanrequest \start "slur"
@@ -1109,7 +932,6 @@ You can attach a (general) span request to a note using
 
 The slur syntax with parentheses is a shorthand for this.
 
-
 @c .  {Ornaments}
 @node Ornaments
 @subsection Ornaments
@@ -1331,13 +1153,12 @@ implemented.
 
 
 
-@c .   {Stem tremolo}
+
 @menu
 * Glissando ::                  
 * Dynamics::                    
 * Crescendo and Decrescendo::   
 * Bar lines::                   
-* Breath marks::                
 @end menu
 
 
@@ -1467,12 +1288,6 @@ You are encouraged to use @code{\repeat} for repetitions.  See
 
 [FIXME]
 
-@c .   {Breath marks}
-@node Breath marks
-@subsubsection Breath marks
-@cindex Breath marks
-
-
 
 @c .  {Bar check}
 @node Bar check
@@ -1496,37 +1311,250 @@ A bar check is entered using the bar symbol, @code{|}
 
 
 
+@c .  {Repeats}
+@node Repeats
+@section Repeats
 
 
+@cindex repeats
+@cindex @code{\repeat}
 
-@c . {Piano music}
-@node Piano music
-@section Piano music
-@menu
-* Automatic staff changes::     
-* Manual staff switches::       
-* Pedals::                      
-* Arpeggio::                    
-* Follow Thread::               
-@end menu 
-
+In order to specify repeats, use the @code{\repeat}
+keyword.  Since repeats look and sound differently when played or
+printed, there are a few different variants of repeats.
 
-@c .   {Automatic staff changes}
-@node Automatic staff changes
-@subsection Automatic staff changes
-@cindex Automatic staff changes
+@table @asis
+@item unfolded  
+Repeated music is fully written (played) out.  Useful for MIDI
+output.
 
-[\autochange]
+@item volta  
+This is the normal notation: Repeats are not written out, but
+alternative endings (voltas) are printed, left to right.
 
-@node Manual staff switches
-@subsection Manual staff switches
+@item folded  
+Alternative endings are written stacked.  Which is unfortunately not
+practical for anything right now.
 
-@cindex manual staff switches
-@cindex staff switch, manual
+@item tremolo
+Make tremolo beams.
+@end table  
 
-@cindex @code{\translator}
-@example
-  \translator @var{contexttype} = @var{name}
+@menu
+* Repeat syntax::               
+* Manual repeat commands::      
+* Tremolo repeats::             
+* Tremolo subdivision::         
+@end menu
+
+@node Repeat syntax
+@subsection Repeat syntax
+
+The syntax for repeats is
+
+@example
+  \repeat @var{variant} @var{repeatcount} @var{repeatbody}
+@end example
+
+If you have alternative endings, you may add
+
+@cindex @code{\alternative}
+@example
+ \alternative @code{@{} @var{alternative1}
+            @var{alternative2}
+            @var{alternative3} @dots{} @code{@}}
+@end example
+
+where each @var{alternative} is a Music expression.
+
+Normal notation repeats are used like this:
+
+@quotation
+
+@lilypond[fragment,verbatim]
+  c'1
+  \repeat volta 2 { c'4 d' e' f' }
+  \repeat volta 2 { f' e' d' c' }
+@end lilypond
+@end quotation
+
+With alternative endings:
+
+@quotation
+
+@lilypond[fragment,verbatim]
+  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 at some point in the future.}
+
+@quotation
+
+@lilypond[fragment,verbatim]
+  c'1
+  \repeat fold 2 {c'4 d' e' f'} 
+  \alternative { {d'2 d'} {f' f} }
+
+@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
+the specified number of repeats.
+
+@quotation
+@lilypond[fragment,verbatim]
+\context Staff {
+  \relative c' {
+    \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, so you have to reset timing information
+after a repeat, eg using bar-checks, @code{Score.measurePosition} or
+@code{\partial}. We hope to fix this after 1.4.
+
+It is possible to nest @code{\repeat}, although it probably is only
+meaningful for unfolded repeats.
+
+@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 . @var{text})
+  Print a volta bracket saying @var{text}.
+@item (volta . #f)
+  Stop a running volta bracket
+@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 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" 4 c16
+  }
+  \paper {
+    linewidth = 40*\staffspace;
+  }  
+}
+@end lilypond
+
+@node Tremolo subdivision
+@subsection Tremolo subdivision
+@cindex tremolo marks
+@cindex @code{tremoloFlags}
+
+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
+
+Tremolos in this style do not carry over into the MIDI output.
+
+Using this mechanism pays off when you entering many tremolos, since the
+default argument saves a lot of typing.
+
+
+
+
+
+@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
+
+Voices can be switched from top to bottom staff automatically. The
+syntax for this is
+@example
+        \autochange @var{contexttype} @var{musicexp}
+@end example
+This will switch notation context of @var{musicexp} between a
+@var{contexttype} named @code{up} and @code{down}. Typically, you use
+@code{Staff} for @var{contexttype}.  The autochanger switches on basis
+of pitch (central C is the turning point), and it looks ahead skipping
+over rests to switch rests in advance.
+        
+@lilypond[verbatim,singleline]
+\score { \notes \context PianoStaff <
+       \context Staff = "up" {
+               \autochange Staff \context Voice = VA < \relative c' { g4 a  b c d r4 a g } >
+       }
+       \context Staff = "down" {
+               \clef bass; 
+               s1*2
+       } > }
+@end lilypond
+
+
+
+
+@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
@@ -1545,7 +1573,28 @@ Usually this is used to switch staffs in Piano music, e.g.
 @subsection Pedals
 @cindex Pedals
 
-[todo]
+Piano pedals can be entered using the following span requests of the
+types @code{Sustain}, @code{UnaChorda} and @code{Sostenuto}:
+@lilypond[fragment,verbatim]
+c''4 \spanrequest \start "Sustain"  c4 c4  \spanrequest \stop "Sustain"
+@end lilypond
+
+For these verbose expressions, standard shorthands have been defined:
+@table @code
+@item sustainDown
+@item sustainUp
+@item unaChorda
+@item treChorde
+@item sostenutoDown
+@item sostenutoUp
+@end table
+
+The symbols that are printed can be modified by setting pedalXStrings,
+where one of the pedal types. Refer to the generaetd documentation for
+more information.
+
+Currently, brackets are not supported, only text markings (ie. Ped*
+style).
 
 
 @c .   {Arpeggio}
@@ -1622,6 +1671,7 @@ can be printed automatically. This is enabled if the property
 * Lyrics mode::                 
 * Printing lyrics::             
 * Automatic syllable durations::  
+* More stanzas::                
 @end menu
 
 @c .  {Lyrics mode}
@@ -1774,7 +1824,6 @@ For example:
 @cindex Automatic syllable durations
 
 
-[explain automatic phrasing]
 @cindex automatic lyric durations
 @cindex @code{\addlyrics}
 
@@ -1827,6 +1876,40 @@ undesired effects when using multiple stanzas:
 It is valid (but probably not very useful) to use notes instead of
 lyrics for @var{musicexpr2}.
 
+@node More stanzas
+@subsection More stanzas
+
+@cindex phrasing
+
+If you have multiple stanzas printed underneath each other, the separate
+syllables should be aligned around punctuation. LilyPond can do this if
+you explain it which lyric lines belong to which melody.
+
+To this end, give the Voice context an identity, and set the LyricsVoice
+to name starting with that identity. In the following example, the Voice
+identity is @code{duet}, and the identities of the LyricsVoices are
+@code{duet-1} and @code{duet-2}.
+
+
+@lilypond[singleline,verbatim]
+\score {
+\addlyrics
+  \notes \relative c'' \context Voice = duet { \time 3/4; g2 e4 a2 f4 g2.  }
+  \lyrics \context Lyrics <
+  \context LyricsVoice = "duet-1" {
+    \property LyricsVoice . stanza = "Bert"
+    Hi, my name is bert.    }
+  \context LyricsVoice = "duet-2" {
+    \property LyricsVoice . stanza = "Ernie" 
+    Ooooo, ch\'e -- ri, je t'aime. }
+  >
+}
+@end lilypond
+
+You can add stanza numbers by setting @code{LyricsVoice.Stanza} (for the
+first system) and @code{LyricsVoice.stz} for the following systems.
+
+@cindex stanza numbering
 
 
 @c . {Chords}
@@ -1992,7 +2075,7 @@ For displaying printed chord names, use the @code{ChordNames} and
 the notation described above, or directly using simultaneous music.
 
 @quotation
-@lilypond[verbatim]
+@lilypond[verbatim,singleline]
 scheme = \notes {
   \chords {a1 b c} <d f g>  <e g b>
 }
@@ -2001,7 +2084,6 @@ scheme = \notes {
     \context ChordNamesVoice \scheme
     \context Staff \transpose c'' \scheme
   >
-  \paper { linewidth = -1.; }
 }
 @end lilypond
 @end quotation
@@ -2042,7 +2124,7 @@ identify chord inversions or added base, which may result in strange
 chord names when chords are entered as a list of pitches:
 
 @quotation
-@lilypond[verbatim,center]
+@lilypond[verbatim,center,singleline]
 scheme = \notes {
   <c'1 e' g'>
   <e' g' c''>
@@ -2054,7 +2136,6 @@ scheme = \notes {
     \context ChordNamesVoice \scheme
     \context Staff \scheme
   >
-  \paper { linewidth = -1.; }
 }
 @end lilypond
 @end quotation
@@ -2063,7 +2144,7 @@ To specify chord inversions, append @code{/<notename>}.  To specify an
 added bass note, append @code{/+<notename}:
 
 @quotation
-@lilypond[verbatim,center]
+@lilypond[verbatim,center,singleline]
 scheme = \chords {
   d1 d/a d/+gis
 }
@@ -2073,7 +2154,6 @@ scheme = \chords {
     \context ChordNames \scheme
     \context Staff \transpose c'' \scheme
   >
-  \paper { linewidth = -1.; }
 }
 @end lilypond
 @end quotation
@@ -2202,21 +2282,11 @@ scheme = \chords {
 * Rehearsal marks::             
 * Instrument names::            
 * Transpose::                   
+* Sound output for transposing instruments::  
 * Multi measure rests::         
+* Automatic part combining::    
 @end menu
 
-[TODO:
-
-partcombine
-
-rehearsal marks
-
-tranposing midi property.
-
-instrument names
-
-] 
-
 @c .   {Rehearsal marks}
 @node Rehearsal marks
 @subsection Rehearsal marks
@@ -2255,10 +2325,10 @@ You can specify an instrument name for a staff by setting
 before the start of the staff. For the first start, @code{instrument} is
 used, for the next ones @code{instr} is used.
 
-@lilypond[verbatim]
+@lilypond[verbatim,singleline]
 \score { \notes {
   \property Staff.instrument = "instr " { c''4 } }
-  \paper { linewidth = -1.;
+  \paper { 
     \translator { \StaffContext
     \consists "Instrument_name_engraver"; } } }
 @end lilypond
@@ -2304,6 +2374,21 @@ 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}.
 
+@node Sound output for transposing instruments
+@subsection Sound output transposing instruments
+
+When you want to play a score containing transposed and untransposed
+instruments, you have to instruct LilyPond the pitch offset (in
+semitones) for the transposed instruments. This is done using
+@code{transposing}.
+
+@cindex @code{transposing}
+
+@example
+       \property Staff.instrument = #"Cl. in B-flat"
+       \property Staff.transposing = #-2
+@end example
+
 
 @c .  {Multi measure rests}
 @node  Multi measure rests
@@ -2328,6 +2413,12 @@ multimeasure rest.
 
 @cindex condensing rests
 
+@node Automatic part combining
+@subsection Automatic part combining
+
+[TODO]
+
+
 @c . {Custodes}
 @node Custodes
 @section Custodes
@@ -2378,15 +2469,257 @@ are @code{vaticana}, @code{medicaea}, @code{hufnagel} and
 @}
 @end quotation
 
-The property can also be set locally, for example in a @code{\notes}
-block:
+The property can also be set locally, for example in a @code{\notes}
+block:
+
+@quotation
+\notes @{
+  \property Staff.Custos \override #'style = #'vaticana
+  c'1 d' e' d' \break c' d' e' d'
+@}
+@end quotation
+
+@c . {Tuning output}
+@node Tuning output
+@section Tuning output
+
+LilyPond tries to take as much formatting as possible out of your
+hands. Nevertheless, there are situations where it needs some help, or
+where you want to override its decisions.
+
+Here we discuss how you can do that.
+
+Notational output is specified in so called grobs (graphic
+objects). Each grob carries with it a set of properties (grob
+properties) specific to that grob.  For example, a stem grob has grob
+properties that specify its direction, length and thickness.
+
+The most common way of tuning the output is to alter the values of these
+properties. There are two ways of doing that: first, you can
+specifically select a set of grobs at one point, and set properties as
+you wish, or secondly, you can (temporarily) modify the definition of a
+grob, thereby affecting an entire group of grobs.
+
+@menu
+* Tuning groups of grobs ::     
+* Tuning per grob ::            
+* What to tune?::               
+* Text markup::                 
+@end menu
+
+@node Tuning groups of grobs 
+@subsection Tuning groups of grobs 
+
+@cindex grob description
+
+A grob definition is an association list, that is stored in a context
+property.  By assigning to that property (using plain @code{\property}),
+you can change the resulting grobs.  
+@lilypond[verbatim, fragment]
+c'4 \property Voice.Stem = #'((meta .  ((interfaces . ())))) c'4
+@end lilypond
+The @code{\property} statement effectively empties the definition of the
+Stem object. One of the effects is that property specifying how it
+should be printed is erased, with the effect of rendering it invisible.
+
+@cindex \override
+@cindex \revert
+@cindex \set
+
+
+This mechanism is fairly crude, since you can only set, but not modify,
+the definition of a grob. For this reason, there is a more advanced
+mechanism: you can add a property on top of an existing definition, or
+remove a property: @code{\override} adds a settings, @code{\revert}
+removes that setting.
+@lilypond[verbatim]
+c'4 \property Voice.Stem \override #'thickness = #4.0
+c'4 \property Voice.Stem \revert #'thickness
+c'4
+@end lilypond
+
+For the digirati, the grob description is an Scheme association
+list. Since it is singly linked, we can treat it as a stack, and
+@code{\override} and @code{\revert} are just push and pop
+operations. This pushing and popping is also used in the
+@code{autoBeamSettings} property.
+
+If you revert a setting which was not set in the first place, then it
+has no effect. However, if the setting was set as a system default, it
+may remove the default value, and this may give surprising results,
+including crashes.  In other words, if you use @code{\override} and
+@code{\revert}, be sure to balance the overrides and reverts.
+
+If balancing them is too much work, use the following shorthand:
+@code{\set} performs a revert followed by an override:
+@example
+\property Voice.Stem \set #'thickness = #2.0
+@end example
+
+Formally the syntax for these constructions is
+@example
+\property @var{context}.@var{grobname} \override @var{symbol} = @var{value}
+\property @var{context}.@var{grobname} \set @var{symbol} = @var{value}
+\property @var{context}.@var{grobname} \revert @var{symbol}
+@end example
+Here @var{symbol} is a Scheme expression of symbol type, @var{context}
+and @var{grobname} are strings and @var{value} is a Scheme expression.
+
+LilyPond will hang or crash if @var{value} contains cyclic references.
+
+
+
+@node Tuning per grob 
+@subsection Tuning per grob 
+
+@cindex \outputproperty
+
+A second way of tuning grobs is the more arcane @code{\outputproperty}
+feature.
+Syntax is as follows
+@example
+\outputproperty @var{predicate} @var{symbol} = @var{value}
+@end example
+Here @code{predicate} is a Scheme functoin taking a grob a argument
+argument, and returning a boolean.  This statement is processed by the
+@code{Output_property_engraver}.  It instructs the engraver to feed all
+grobs that it sees to @var{predicate}. Whenever the predicate returns
+true, the grob property @var{symbol} will be set to @var{value}.
+
+You will need to combine this statement with @code{\context} to select
+the appropriate context to apply this to.
+
+If possible, avoid this feature: the semantics are not very clean, and
+the syntax and semantics are up for rewrite.
+
+Here are some random examples:
+
+@lilypond[fragment,verbatim,singleline]
+\relative c'' { c4
+  \context Staff \outputproperty
+  #(make-type-checker 'note-head-interface)
+  #'extra-offset = #'(0.5 . 0.75)
+  <c8 e g> }
+@end lilypond
+
+@cindex @code{extra-offset}
+
+This selects all note heads occurring at current staff level, and sets
+the @code{extra-offset} of those heads to @code{(0.5,0.75)}, shifting
+them up and right.
+
+Move the text "m.d.", but not the fingering instruction "2".
+@lilypond[verbatim,singleline]
+#(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."    
+  }
+}
+@end lilypond
+
+
+
+
+@node What to tune?
+@subsection What to tune?
+
+This all tells you how to tune grobs, but what variables are there? The
+question is not  answered in this manual (although you may encounter
+some examples.).
+
+Grob properties are tied directly to the implementation of LilyPond, and
+they are thus a moving target. Refer to the automatically generated
+documentation of the internals (available from the website).
+
+You need the following information
+
+@itemize @bullet
+@item
+which grob to modify
+@item
+which property to modify
+@item
+which context the grob comes from.
+@end itemize
+
+Included with the automatically generated documentation is a master list
+of grobs. Each one can be clicked, taking you to a overview of the
+available properties.
+
+There is also a master list of contexts. Clicking each takes you to an
+overview of the context, listing which grob types are created there.
+
+
+
+@node Text markup
+@subsection Text markup
+@cindex text markup
+@cindex markup text
+
+LilyPond has an internal mechanism to typeset texts. You can
+form text markup expressions by composing scheme expressions
+in the following way.
+
+@lilypond[verbatim]
+\score { \notes \relative c' {
+  b-#"text"
+  c-#'(bold "text")
+  d-#'(lines "one" (bold "text"))
+  e-#'(music (named "noteheads-2" "flags-u3"))
+}
+\paper { linewidth = 10.\cm; } }
+@end lilypond
+
+Normally, the Scheme markup text is stored in the @code{text} property
+of a grob.  Formally, it is defined as follows:
+
+@example
+text: string | (head? text+)
+head: markup | (markup+)
+markup-item: property | abbrev | @var{fontstyle}
+property: (@var{key} . @var{value})
+abbrev: @code{rows lines roman music bold italic named super sub text}
+@end example
+
+The markup is broken down and converted into a list of grob properties,
+which are prepended to the grop's property list.  The
+@var{key}-@var{value} pair is a grob property.
+
+The following abbreviations are currently
+defined:
+
+@table @code
+@item rows
+horizontal mode: set all text on one line (default)
+@item lines
+ vertical mode: set every text on new line
+@item roman
+ select roman font
+@item music
+ select feta font
+@item bold
+ select bold series
+@item italic
+ select italic shape
+@item named
+ lookup by character name
+@item text
+ plain text lookup (by character value)
+@item super
+ superscript
+@item sub
+ subscript
+@end table
+
+@var{fontstyle} may be any of @code{finger volta timesig mmrest mark
+script large Large dynamic}
 
-@quotation
-\notes @{
-  \property Staff.Custos \override #'style = #'vaticana
-  c'1 d' e' d' \break c' d' e' d'
-@}
-@end quotation
 
 @c . {Page layout}
 @node Page layout
@@ -2420,7 +2753,7 @@ 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{Context definitions} for
+  @item  A context definition.  See Section @ref{Notation contexts} for
        more information on context definitions.
 
   @item  \stylesheet  declaration.  Its syntax is
@@ -2596,6 +2929,14 @@ example file @file{input/test/between-systems.ly}
 @node Sound
 @section Sound
 @cindex Sound
+
+LilyPond allows MIDI output, with the purpose of proof-hearing the music
+you enter. The performance lacks lots of interesting effects, such as
+swing, articulation, slurring, tieing, etc.
+
+Also note that it is not possible to use the percussion channel
+(generally channel 10 of a MIDI file).
+
 @menu
 * MIDI block::                  
 * MIDI instrument names::       
@@ -2807,7 +3148,8 @@ relative within transposed music, you must place an additional
 * Creating contexts::           
 * Default contexts::            
 * Context properties::          
-* Context definitions::         
+* Changing context definitions::  
+* Defining new contexts::       
 @end menu
 
 @c .  {Music expressions}
@@ -2866,7 +3208,7 @@ context does not exist, it will be created.
 
 @quotation
 
-@lilypond[verbatim]
+@lilypond[verbatim,singleline]
 \score {
   \notes \relative c'' {
     c4 <d4 \context Staff = "another" e4> f
@@ -2894,7 +3236,7 @@ notation context from their parent. Each note is a music expression, and
 as you can see in the following example, only the sequential music
 enclosing the three notes has an explicit context. 
 
-@lilypond[verbatim]
+@lilypond[verbatim,singleline]
 \score { \notes \context Voice = goUp { c'4 d' e' } } 
 @end lilypond
 
@@ -2910,7 +3252,7 @@ words, you may think of @code{\score} working like
 @end example
 
 Sequential music follows the contexts of its "children".  Take this example
-@lilypond
+@lilypond[verbatim, singleline]
 \score { \context Score \notes { c'4 (  d' )e' } }
 @end lilypond
 
@@ -2922,15 +3264,17 @@ music is also interpreted with the same Thread, Voice and Staff context,
 putting the notes on the same staff, in the same voice.
 
 This is a convenient mechanism, but do not expect opening chords to work
-without @code{\context}. For every note, a separate staff
-@lilypond
+without @code{\context}. For every note, a separate staff is
+instantiated.
+
+@lilypond[verbatim, singleline]
 \score { \notes <c'4 es'> } 
 @end lilypond
 
 Of course, if the chord is preceded by a normal note in sequential
 music, the chord will be interpreted by the Thread of the preceding
 note:
-@lilypond
+@lilypond[verbatim,singleline]
 \score { \notes { c'4 <c'4 es'> }  }
 @end lilypond
 
@@ -2960,33 +3304,94 @@ example) and thus take effect in all @code{Voice} contexts.
 
 
 @c .  {Context definitions}
-@node Context definitions
-@subsection Context definitions
+@node Changing context definitions
+@subsection Changing context definitions
 
 @cindex context definition
 @cindex translator definition
 
-[todo: ]
+The most common way to define a context is by extending an existing
+context.  You can change an existing context from the paper block, by
+first initializing a translator with an existing context identifier:
+@example
+\paper @{
+  \translator @{
+    @var{context-identifier}
+  @} @}
+@end example
+Then you can add engravers, remove engravers and set context
+properties. The syntax for these operations are respectively
+@example
+ \remove @var{engravername}
+ \consists @var{engravername}
+ @var{propname} = @var{value} 
+@end example
 
-A notation contexts is defined by the following information
+Here @var{engravername} is a string, the name of an engraver in the
+system. @var{propname} is a string and @var{value} is a Scheme
+expression.
 
-@enumerate 1
-  @item  A name.
+@lilypond[verbatim,singleline]
+\score {  \notes {
+        c'4 c'4 }
+  \paper {
+    \translator  { \StaffContext
+        \consists Instrument_name_engraver;
+        instrument = #"foo"
+        \remove Clef_engraver;
+       } } }
+@end lilypond
 
-  @item  The LilyPond modules that do the actual conversion of music to
-       notation.  Each module is a so-called
-       @emph{engraver}
 @cindex engraver
-.
 
-  @item  How these modules should cooperate, i.e. which ``cooperation
-       module'' should be used.  This cooperation module is a special
-       type of engraver.
+These type of property assignments happen before interpretation starts,
+so a @code{\property} expression will override any predefined settings.
+
+Engravers are the actual C++ modules that do the work in the
+interpretation phase.
+
+
+There are some pre-defined identifiers to simplify editing translators,
+they are defined in @file{ly/engraver.ly}.  These pre-defined
+identifiers are:
+
+@table @code
+@cindex @code{StaffContext}
+  @item @code{StaffContext}  
+    Default Staff context. 
+@cindex @code{RhythmicStaffContext}
+
+  @item @code{RhythmicStaffContext}  
+    Default RhythmicStaff context. 
+@cindex @code{VoiceContext}
+
+  @item @code{VoiceContext}  
+    Default Voice context.  
+@cindex @code{ScoreContext}
+
+  @item @code{ScoreContext}  
+    Default Score context. 
+
+@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.}
+@end table
+
+@node Defining new contexts
+@subsection Defining new contexts
+
+If you want to build a context from scratch, you must also supply the
+following extra information:
+@itemize @bullet
+  @item  A name, specified by @code{\name @var{contextname};}.
 
-  @item  What other contexts the context can contain,
+  @item A cooperation engraver. This is specified by   @code{\type
+@var{typename};}.
+@end itemize
 
-  @item  What properties are defined.
-@end enumerate
 
 A context definition has this syntax:
 
@@ -2999,18 +3404,24 @@ A context definition has this syntax:
 
 @var{translatorinit} can be an identifier or 
 @example
-  \type @var{typename} @code{;}
+
 @end example
 where @var{typename} is one of
 
+The cooperation engraver groups other engravers, and specifies how they
+should cooperate. Choices are:
+
 @table @code
 @cindex @code{Engraver_group_engraver}
   @item @code{Engraver_group_engraver}  
     The standard cooperation engraver.
+
 @cindex @code{Score_engraver}
 
   @item @code{Score_engraver}  
-    This is cooperation module that should be in the top level context.
+    This is cooperation module that should be in the top level context,
+and only the toplevel context.
+
 @cindex @code{Grace_engraver_group}
 
   @item @code{Grace_engraver_group}  
@@ -3084,52 +3495,6 @@ such an identifier outside of @code{\score}, you must do
 
 @cindex paper types, engravers, and pre-defined translators
 
-Some pre-defined identifiers can simplify modification of
-translators.  The pre-defined identifiers are:
-
-@table @code
-@cindex @code{StaffContext}
-  @item @code{StaffContext}  
-    Default Staff context. 
-@cindex @code{RhythmicStaffContext}
-
-  @item @code{RhythmicStaffContext}  
-    Default RhythmicStaff context. 
-@cindex @code{VoiceContext}
-
-  @item @code{VoiceContext}  
-    Default Voice context.  
-@cindex @code{ScoreContext}
-
-  @item @code{ScoreContext}  
-    Default Score context. 
-
-@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.}
-
-@end table
-
-Using these pre-defined values, you can remove or add items to the
-translator:
-
-@quotation
-
-@example 
-\paper @{
-  \translator @{
-    \StaffContext
-    \remove Some_engraver;
-    \consists Different_engraver;
-  @}
-@} 
-@end example 
-
-@end quotation
-
       
 
 
@@ -3141,9 +3506,6 @@ is
   @var{propname} @code{=} @var{value}
 @end example
 
-This assignment happens before interpretation starts, so a
-@code{\property} expression will override any predefined settings.
-
 The property settings are used during the interpretation phase.  They
 are read by the LilyPond modules where interpretation contexts are
 built of.  These modules are called @emph{translators}.  Translators for
@@ -3176,7 +3538,10 @@ called @emph{performers}.
 This section describes what you may enter at top level.
 
 
-@unnumberedsubsec Score definition
+@c .   {Score}
+@subsubsection Score
+@cindex Score
+
 @cindex score definition
 
 The output is generated combining a music expression with an output
@@ -3190,17 +3555,12 @@ definition.  A score block has the following syntax:
 definition is supplied, the default @code{\paper} block will be added.
 
 
-@c .   {Score}
-@subsubsection Score
-@cindex Score
 
-@c .   {Paper}
-@subsubsection Paper
-@cindex Paper
+@c .   {Default output}
+@subsubsection Default output
 
-@c .   {Midi}
-@subsubsection Midi
-@cindex Midi
+Default values for the @code{\paper} and @code{\midi} block are set by
+entering such a block at top-level.
 
 @c .   {Header}
 @subsubsection Header
@@ -3334,22 +3694,16 @@ However, in some cases, LilyPond will also try to choose contexts, and
 use the structure of the music expression  to do so. This can have
 undesired effects: for example, LilyPond will create a separate staff
 for each note if you start a @code{\score} with a  chord:
-@lilypond[verbatim,center]
+@lilypond[verbatim,center,singleline]
   \score {
     \notes <c''4 e''>
-    \paper {
-      linewidth = -1.;
-    }
   }
 @end lilypond
   The solution is to explicitly instantiate the context you desire.
 In this case this is typically a Voice context
-@lilypond[verbatim,center]
+@lilypond[verbatim,center,singleline]
   \score {
     \notes\context Voice <c''4 e''>
-    \paper {
-      linewidth = -1.;
-    }
   }
 @end lilypond
 If you use @code{\context Staff} you will get separate stems for each
@@ -3714,229 +4068,6 @@ foo = -6
 
 
 
-@c . {Unsorted}
-@node Unsorted
-@section Unsorted
-
-[mucho todo]
-
-Translation?
-
-@cindex properties
-@unnumberedsubsec Translation property
-
-
-[todo: add \set/\override/\revert]
-
-
-
-@cindex output properties
-@unnumberedsubsec Output properties
-
-These allow you to tweak what is happening in the back-end
-directly. If you want to control every detail of the output
-formatting, this is the feature to use. The downside to this is that
-you need to know exactly how the backend works. Example:
-
-
-@lilypond[fragment,verbatim]
-\relative c'' { c4
-  \context Staff \outputproperty
-  #(make-type-checker 'note-head-interface)
-  #'extra-offset = #'(0.5 . 0.75)
-  <c8 e g> }
-@end lilypond
-
-This selects all note heads occurring at current staff level, and sets
-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
-result will depend very heavily on the implementation of the backend,
-which we change regularly and unscrupulously.
-
-
-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
-
-
-@menu
-* Text markup::                 
-@end menu
-
-@node Text markup
-@subsection Text markup
-@cindex text markup
-@cindex markup text
-
-LilyPond has an internal mechanism to typeset texts: you can
-form text markup expressions by composing scheme expressions
-in the following way:
-
-@lilypond[verbatim]
-\score { \notes \relative c' {
-  b-#"text"
-  c-#'(bold "text")
-  d-#'(lines "one" (bold "text"))
-  e-#'(music (named "noteheads-2" "flags-u3"))
-}
-\paper { linewidth = 10.\cm; } }
-@end lilypond
-
-Formally, Scheme markup text is defined as follows:
-
-@example
-text: string | (head? text+)
-head: markup | (markup+)
-markup-item: property | abbrev | @var{fontstyle}
-property: (@var{key} . @var{value})
-abbrev: @code{rows lines roman music bold italic named super sub text}
-@end example
-
-The markup is broken down and converted into a list of grob properties,
-which are prepended to the grop's property list.  The
-@var{key}-@var{value} pair is a grob property.
-@ignore
-[Why is this useful?]
-
-?Snapnie: markup text is eerste item dat voldoet aan mijn gewelfdige,
-ideale idee van direct-en-eenmalig-per-item te zetten properties, ipv
-gehaspel via \property en hopen dat je property (enkel) in juiste item
-terecht gaat komen.  Heb je deze wel bewust meegemaakt:
-
-Sender: jan@appel.lilypond.org
-To: Han-Wen <hanwen@cs.uu.nl>   
-Subject: (elt) properties
-Organization: Jan at Appel
-From: janneke@gnu.org
-Date: 01 Nov 2000 10:39:10 +0100
-Message-ID: <m3og00av5t.fsf@appel.lilypond.org>
-User-Agent: Gnus/5.0807 (Gnus v5.8.7) Emacs/20.7
-MIME-Version: 1.0
-Content-Type: text/plain; charset=us-ascii
-Lines: 77
-Xref: appel.lilypond.org vers:1991
-
-Hi,
-
-Wat ik vooral mis, is een koele manier om een propertie eenmalig aan
-een element te hangen.  Hoop dat je zinvol over wilt meedenken; zie
-het monster van les-nereides.  Misschien dat we 't niet moeten doen
-voor 1.4 maar wachten tot properties nog wat verder
-uitgekristalliseerd zijn?
-
-Nu moet je
-
-   \property Voice.Stem \push #'length = #'6
-   a
-   \property Voice.Stem \pop #'length
-   b
-
-waarmee je in feite zeg tegen de stem-engraver: vanaf nu aan moet je
-alle stems 6 lang maken (maakt stem); onee, doe maar weer default
-lengte.
-
-Maar dat is eigenlijk niet wat je bedoelt, wat je zou willen is net
-zo'n directe interface als wat we nu hebben voor markup text, bv. iets
-van:
-
-   a+#'(Stem::length . 6) b
-
-Bij markup text kun je direct en eenmalig een reeks properties aan een
-enkel item toevoegen; iets wat je volgens mij vaak nodig hebt.
-
-Ik zat eerst te denken aan ``request properties'': properties
-toevoegen aan request, die dan worden doorgegeven aan alle items die
-door dat request worden gemaakt.
-
-Maar misschien zuigt dat wel te vreselijk en moeten we iets van
-``volatile'' properties maken.
-
-Btw,
-
-    \property Voice.Slur \push #'dash = #1
-    \property Voice.Slur \pop #'dash
-    a()b
-    \property Voice.Slur \push #'direction = #-1
-    \property Voice.Slur \pop #'direction
-    ()c
-
-of de kluts waar ik brr van word, eigenlijk ook alleen doenbaar is
-voor wat veelgebruikte properties:
-
-    slurDotted = \property Voice.Slur \push #'dash = #1
-    slurNoDots = \property Voice.Slur \pop #'dash
-    slurUp = \property Voice.Slur \push #'direction = #1
-    slurDown = \property Voice.Slur \push #'direction = #-1
-    slurBoth = \property Voice.Slur \pop #'direction
-
-    [..]
-
-    \slurDotted\slurDown
-    a()b
-    ()c
-    \slurNoDots\slurBoth
-
-zou toch graag meer iets in trant van, als je begrijpt wat ik bedoel
-
-    Slur+#'((dash . 1) (direction . 1))
-    b () c
-    Slur-#'(dash direction)
-
-ofwel
-
-    a(+#'((dash . 1) (direction . 1))
-    )b(+#'((dash . 1) (direction . 1))
-    )c
-@end ignore
-
-The following abbreviations are currently
-defined:
-
-@table @code
-@item rows
-horizontal mode: set all text on one line (default)
-@item lines
- vertical mode: set every text on new line
-@item roman
- select roman font
-@item music
- select feta font
-@item bold
- select bold series
-@item italic
- select italic shape
-@item named
- lookup by character name
-@item text
- plain text lookup (by character value)
-@item super
- superscript
-@item sub
- subscript
-@end table
-
-
-@var{fontstyle} may be any of @code{finger volta timesig mmrest mark
-script large Large dynamic}
-
-@ignore
-[kern, raise ??]
-Wat is daarmee, zijn toch gewoon grob properties van text-interface?
-@end ignore
 
 @c .{Local emacs vars}
 @c Local variables:
index c86ccfae3d668cbc705748676bc4ab2e58828166..2160899c590386d964f33e1355e9342019c805bf 100644 (file)
@@ -33,8 +33,8 @@ subdirectory @file{input/tutorial/}.@footnote{When we refer
 to filenames, they are relative to the top directory of the source
 package.
 @cindex file names
-} We recommend that you experiment with writing Lilypond input yourself,
-to get a feel for how the program behaves.
+}. We recommend that you experiment with writing Lilypond input
+yourself, to get a feel for how the program behaves.
 
 
 @node Running LilyPond
@@ -66,7 +66,7 @@ If you run Unix, proceed as follows: run lilypond on the file, i.e.,
 @example
   lilypond test
 @end example
-You will the following on your screen:
+You will see the following on your screen:
 @example
 GNU LilyPond 1.3.125.
 Now processing: `input/tutorial/test.ly'
@@ -78,7 +78,7 @@ paper output to test.tex...
 @end example
 
 Now, run @TeX{}@footnote{@TeX{} is a text-typesetting system that is
-especially suited for typesetting mathematics}. The result should
+especially suited for typesetting mathematics.}. The result should
 resemble this: 
 @example
 This is TeX, Version 3.14159 (Web2C 7.3.1)
@@ -101,7 +101,7 @@ To view the output, run Xdvi, i.e.
 @example
         xdvi test
 @end example
-You should will see this
+You should see the following in  a window next to some buttons.
 @lilypond
 \header {
  title = "Test";
@@ -112,7 +112,6 @@ You should will see this
   \paper { }
 } 
 @end lilypond
-along with some buttons in a window.
 
 @cindex postscript, converting to
 When you're satisfied with the result, you can print it. For printing,
@@ -132,12 +131,12 @@ This is dvips(k) 5.86 Copyright 1999 Radical Eye Soft ...
 @cindex GhostScript
 @cindex @code{lpr}
 PostScript is a page description language, similar to PDF. Some printers
-can understand a postscript file directly, but the cheapers need the
-intervention of GhostScript, a PostScript   emulator that runs on your
+can understand a postscript file directly, but the cheaper ones need the
+intervention of GhostScript, an emulator that runs PostScript on your
 computer instead of your printer. Most Linux distributions nowadays have
-GhostScript running ``in the  background'', so any configured printer
-will act as a PostScript printer.  Assuming this,  the
-following command will print the  file
+GhostScript running ``in the background'', so any configured printer
+will act as a PostScript printer.  Assuming this, the following command
+will print the file
 @example
         lpr test.ps
 @end example
@@ -145,11 +144,11 @@ If this does not make your printer produce a page of music, then you
 should look into installing and configuring ghostscript.  Refer to
 GhostScript's website at @uref{http://www.ghostscript.com}.  
 
-There are two different routes: firstly, you can add titling to the
-output. This is done by a separate program called ly2dvi: this program
-first calls LilyPond to process the @file{.ly} file, and then runs
-@TeX{} on it to produce a @file{.dvi} file with proper margin settings
-and titling.
+There are three other routes: firstly, you can add titling to the
+output. This is done by a separate program called @file{ly2dvi}: this
+program first calls LilyPond to process the @file{.ly} file, and then
+runs @TeX{} on it to produce a @file{.dvi} file with proper margin
+settings and titling.
 
 @cindex titles, adding
 @cindex ly2dvi
@@ -158,20 +157,27 @@ and titling.
         ly2dvi test.ly
 @end example
 After some disk-activity, you should end up with a @file{.dvi} file.
-6
-Secondly, you can generate PostScript directly. This is not very useful
-currently, but here goes:
+Ly2dvi is further described in the Chapter @ref{ly2dvi}.
+
+Secondly, you can generate PostScript directly. This is  useful if you
+can not or do not want to  run @TeX{} on your system. 
+To obtain PS output, invoke LilyPond as follows:
 @cindex PostScript output
 @example
       lilypond -f ps test.ly  
 @end example
 
-[treat FAQs here, eg. about env vars.]
+You have to set some environment variables to view or print this
+output. More information can be found in the Section @ref{Invoking
+LilyPond}.
 
+Finally, there is a script called lilypond-book, that allows you to
+freely mix LilyPond input with Texinfo or LaTeX input. For example, this
+manual was written using lilypond-book.
 
 @unnumberedsubsec Windows
 
-[todo]
+[TODO]
 
 
 @node The first tune
diff --git a/VERSION b/VERSION
index 76280b660068c1558cfd6325af5c8d1f7ad25d6c..ab4bed8b3f0cecac44a5ebb79710b46f28cef247 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,8 +1,8 @@
 PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
-PATCH_LEVEL=131
-MY_PATCH_LEVEL=jcn2
+PATCH_LEVEL=132
+MY_PATCH_LEVEL=
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index f56ab3bca2b4d4a524d3b065b04359f8bf1274ed..a79e99cc6eea2059d6c47deda1a2d674f991b3a0 100755 (executable)
@@ -3,7 +3,35 @@
 
 name = 'mutopia-index'
 
-import find
+# find.py -- deprecated in python 2.0
+import fnmatch
+import os
+
+_debug = 0
+
+_prune = ['(*)']
+
+def find(pattern, dir = os.curdir):
+        list = []
+        names = os.listdir(dir)
+        names.sort()
+        for name in names:
+                if name in (os.curdir, os.pardir):
+                        continue
+                fullname = os.path.join(dir, name)
+                if fnmatch.fnmatch(name, pattern):
+                        list.append(fullname)
+                if os.path.isdir(fullname) and not os.path.islink(fullname):
+                        for p in _prune:
+                                if fnmatch.fnmatch(name, p):
+                                        if _debug: print "skip", `fullname`
+                                        break
+                        else:
+                                if _debug: print "descend into", `fullname`
+                                list = list + find(pattern, fullname)
+        return list
+
+
 import re
 import os
 import sys
@@ -154,7 +182,7 @@ for opt in options:
 
 dirs  = []
 for f in files:
-       dirs = dirs + find.find ('out-www', f);
+       dirs = dirs + find ('out-www', f)
 
 if not dirs:
        dirs = ['.']
@@ -162,7 +190,7 @@ if not dirs:
 allfiles = []
 
 for d in dirs:
-       allfiles = allfiles + find.find ('*.ly.txt', d)
+       allfiles = allfiles + find ('*.ly.txt', d)
 
 print allfiles
 
index 143b7e2aba017a861cdb3dffa6fc80664d6baddd..84d71f989695311716824d81da4b2ff919c9c020 100755 (executable)
--- a/configure
+++ b/configure
@@ -1151,7 +1151,7 @@ fi
        PATHSEP=':'
        INSTALL="\$(SHELL) \$(stepdir)/../bin/install-dot-exe.sh -c"
     else
-       ROOTSEP='/'
+       ROOTSEP=':'
        DIRSEP='/'
        PATHSEP=':'
        LN=ln
diff --git a/input/bugs/grace-dynamic.ly b/input/bugs/grace-dynamic.ly
new file mode 100644 (file)
index 0000000..3f0767d
--- /dev/null
@@ -0,0 +1,2 @@
+
+\score { \notes {\grace {c'_\f} d e f g}}
diff --git a/input/bugs/ss.ly b/input/bugs/ss.ly
deleted file mode 100644 (file)
index f0585ae..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-\version "1.3.129"
-\include "paper16.ly"
-\score{
-  \notes \context Staff = pr {
-         \context Voice < a b c' e'>
-  }
-  \paper{
-    \translator {
-        \StaffContext
-        StaffSymbol \override #'staff-space = #1.3
-    }
-  }
-}
-
index a7dee3a6a4bd0ae912f0c7a9d16c7b382684cd6a..9d879a06ea544774bee69fc97027abefaea52b71 100644 (file)
 
-\version "1.3.117";
-\include "english.ly"
-
-\header{
-texidoc="
-Multiple stanzas
-
- Tests a number of features:
- * Lyric_phrasing_engraver
- * Stanza_number_engraver
- * Automatic melismata on beamed notes
-
-";
-
-    title = "Crowned with Honour";
-    composer = "Oliver Holden (1765-1844)";
-    poet = "Thomas Kelly (1769-1855)";
-}
-
-allup =  \notes{
-       \stemUp
-       \slurUp
-        \tieUp
-       \property Voice.DynamicLineSpanner \override #'direction = #1
-       \autoBeamOff
-}
-
-alldown =  \notes{
-       \stemDown
-       \slurDown
-        \tieDown
-       \property Voice.DynamicLineSpanner \override #'direction = #-1
-       \autoBeamOff
-}
-
-Global =   \notes{
-        \key g \major;
-        \time 4/4;
-       \partial 4;
-}
-
-Soprano =  \notes \relative c' {
-       \allup
-       d4 | g g b b a g a b a g b a g( a )g % modified to test melisma align right
-
-       [a8 b] | b4 % modified to test melisma align left
-        a g b [d16 d c8] [b a] b4 % modified to test beam melisma
-%      a4 | b a g b [d8 \melisma c] \melismaEnd [b \melisma a] \melismaEnd b4
-
-       d d2 d e d4( cs8 ~ )cs d2.
-
-       b4 | d b g b [a8  g]  [a b]  a4
-%      b4 | d b g b [a8 \melisma g] \melismaEnd [a \melisma b] \melismaEnd a4
-
-       g d'2 c b4.( c8 )a4 a g2.
-}
-Alto =  \notes \relative c'{
-       \alldown
-       d4 | d d g g fs g fs g fs e g fs d2.
-       d4 | g d b g' [b8 a] [g fs] g4 fs g2 a g fs4( e8 )g fs2.
-       d4 | g g d g [fs8 e] [fs g] fs4 g f2 e d4.( d8 )d4 fs4 d2.
-}
-Tenor =  \notes \relative c{
-       \allup
-       d4 | b' b d d c  b c  d c  b d c  b2.
-       a4 | b a g b  [d8 c] [b a] b4 a  b2 c b  a   a2.
-       g4 | b d b d [c8  b] [c  d]  c4 b g2 g g4.( a8 [fs )a] c4 b2.
+       
+\score {
+\addlyrics
+  \notes \relative c'' \context Voice = duetto { \time 3/4; g2 e4 a2 f4 g2.  }
+  \lyrics \context Lyrics <
+  \context LyricsVoice = "duet-1" {
+    \property LyricsVoice . stanza = "Bert"
+    Hi, my name is bert.    }
+  \context LyricsVoice = "duet-2" {
+    \property LyricsVoice . stanza = "Ernie" 
+    Ooooo, ch\'e -- ri, je t'aime. }
+  >
+  \paper { linewidth = -1.0;}
 }
-Bass =  \notes \relative c{
-       \alldown
-       d4 | g g g g d d d g d e d d g,2.
-       d'4 | g d b g' [b8 a] [g fs] g4 d g2 fs e a d,2.
-       g4 | g g g g d d d e b2 c d2. d4 g,2.
-}
-
-TheLyrics =   \lyrics <
-        {
-           \context LyricsVoice = "Soprano-1"
-           \property LyricsVoice .stanza = "1:"
-           \property LyricsVoice .stz = "(1)"
-                The4 head    that once was crowned with thorns
-                Is   crowned with glo -- ry  now;
-                A roy -- al di -- a -- dem a -- dorns
-                The might -- y Vic -- tor's  brow.
-                A roy -- al di -- a -- dem a -- dorns
-                The might -- y Vic -- tor's  brow.
-        }
-        {
-           \context LyricsVoice = "Soprano-2"
-           \property LyricsVoice .stanza = "2:"
-           \property LyricsVoice .stz = "(2)"
-                The4 high -- est place that heav'n af -- fords
-                Is His by sov -- 'reign  right;
-                The King of kings, the Lord of lords,
-                He reigns in glo -- ry  bright,
-                The King of kings, the Lord of lords, 
-                He reigns in glo -- ry  bright.
-        }
-        {
-           \context LyricsVoice = "Soprano-3"
-           \property LyricsVoice .stanza = "3:"
-           \property LyricsVoice .stz = "(3)"
-                The joy of all who dwell a -- bove,
-                The joy of saints be --  low,
-                To4 whom He man -- i -- fests His love,
-                And grants His name to  know,
-                To4 whom He man -- i -- fests His love,
-                And grants His name to4  know.
-        }
->
-
 
-\score{
-  \context ChoirStaff
-    \notes
-    <
-      \property Score.barNumberScriptPadding = #10.0
-      \context Staff = "treblestaff"{
-        <
-         \context Voice = "Soprano" { }
-         \context Voice = "Alto" { }
-        >
-      }
-      \context Lyrics = mainlyrics { }
-      \context Staff = "treblestaff"{
-       <
-         \Global
-         \addlyrics { \context Voice = "Soprano" \Soprano }
-           { \context Lyrics = mainlyrics \TheLyrics }
-         \context Voice = "Alto"  \Alto
-        >
-       \bar "|.";
-      }
-      \context Staff = "bassstaff"{
-        \clef "bass";
-       <
-         \context Voice = "Tenor" { \Tenor }
-         \context Voice = "Bass"  { \Bass }
-       >
-        \bar "|.";
-      }
-    >
-
-   \paper {
-      \translator{
-       \VoiceContext
-       automaticMelismata = ##t;
-       noAutoBeaming = ##t;
-        \remove   "Auto_beam_engraver";
-      }
-
-   }
-}
index dfb79e812b60cc55f852988c4145a5249c8ab93c..5df19061aad3e580d2ec1f6c28a4c8c5bbc7e7c9 100644 (file)
@@ -26,7 +26,7 @@ Align_interface::alignment_callback (SCM element_smob, SCM axis)
   Grob * par = me->parent_l (ax);
   if (par && !to_boolean (par->get_grob_property ("alignment-done")))
     {
-      Align_interface::align_to_extents (par, ax);
+      Align_interface::align_elements_to_extents (par, ax);
     }
   return gh_double2scm (0.0);
 }
@@ -81,7 +81,7 @@ Align_interface::align_to_fixed_distance (Grob *me , Axis a)
   from the outside by setting minimum-space and extra-space in its
   children */
 void
-Align_interface::align_to_extents (Grob * me, Axis a)
+Align_interface::align_elements_to_extents (Grob * me, Axis a)
 {
   me->set_grob_property ("alignment-done", SCM_BOOL_T);
   
@@ -139,15 +139,30 @@ Align_interface::align_to_extents (Grob * me, Axis a)
     }
   
  
-  Real where_f=0;
+  /*
+    Read self-alignment-X and self-alignment-Y. This may seem like
+    code duplication. (and really: it is), but this is necessary to
+    prevent ugly cyclic dependencies that arise when you combine
+    self-alignment on a child with alignment of children.
+  */
+
+  String s ("self-alignment-");
+
+  s +=  (a == X_AXIS) ? "X" : "Y";
+
+  SCM align (me->get_grob_property (s.ch_C()));
+     
   Array<Real> translates ;
+  Interval total;
+  Real where_f=0;
+  
   for (int j=0 ;  j < elems.size(); j++) 
     {
       Real dy = 0.0;
       dy = - stacking_dir * dims[j][-stacking_dir];
       if (j)
        dy += stacking_dir * dims[j-1][stacking_dir];
-      
+
       if (j)
        {
          dy = (dy >? threshold[SMALLER] )
@@ -155,12 +170,19 @@ Align_interface::align_to_extents (Grob * me, Axis a)
        }
 
       where_f += stacking_dir * dy;
+      total.unite ( dims[j] +   where_f);
       translates.push (where_f);
     }
 
+  
+
+  Grob * align_center = unsmob_grob (align);
+  Real center_offset = 0.0;
+  
   /*
     also move the grobs that were empty, to maintain spatial order. 
    */
+  Array<Real> all_translates;
   if (translates.size  ())
     {
       int i =0;
@@ -172,11 +194,20 @@ Align_interface::align_to_extents (Grob * me, Axis a)
            {
              w = translates[i++];
            }
-         all_grobs[j]->translate_axis (w, a);
-
+         if (all_grobs[j] == align_center)
+           center_offset = w;
+         all_translates .push (w);
          j++;
        }
     }
+
+  if (isdir_b  (align))
+    {
+      center_offset = total.linear_combination (gh_scm2double (align));
+    }
+
+  for (int j = 0 ;  j < all_grobs.size (); j++)
+    all_grobs[j]->translate_axis (all_translates[j] - center_offset, a);
 }
 
 Axis
index 057ea369457d3236f043768ab698f6b3a16841b0..f17922a0179335610024ca71ad2dd4fc8d29b1a2 100644 (file)
@@ -110,12 +110,7 @@ Break_align_engraver::acknowledge_grob (Grob_info inf)
          SCM edge_sym = ly_symbol2scm ("Left_edge_item");
          Item * edge = new Item (get_property ("LeftEdge"));
 
-         /*
-           We must have left-edge in the middle.  Instrument-names
-           are left to left-edge, so they don't enter the staff.
-         */
-         align_l_->set_grob_property ("self-alignment-X", edge->self_scm ());
-         
+        
 
          /*
            If the element is empty, it will be ignored in the break
@@ -125,8 +120,12 @@ Break_align_engraver::acknowledge_grob (Grob_info inf)
          */
          edge->set_extent_callback (Grob::point_dimension_callback_proc, X_AXIS);
          
+         /*
+           We must have left-edge in the middle.  Instrument-names
+           are left to left-edge, so they don't enter the staff.
+         */
          align_l_->set_grob_property ("self-alignment-X", edge->self_scm ());
-
+         
          announce_grob (edge, 0);
          column_alist_ = scm_assoc_set_x (column_alist_, edge_sym, edge->self_scm ());
        }
index 36f536ba0fd4d2313b312feff9d9c26ae6e2abbf..4318f0b78d534e5e058987f08e5cf276494c7043 100644 (file)
@@ -64,6 +64,11 @@ Break_align_interface::self_align_callback (SCM element_smob, SCM axis)
       me->set_grob_property ("self-alignment-X", gh_int2scm (RIGHT));
     }
 
+  /*
+    Force break alignment itself to be done first, in the case
+   */
+  
+  
   return Side_position::aligned_on_self (element_smob, axis);  
 }
 
@@ -169,7 +174,7 @@ Break_align_interface::do_alignment (Grob *me)
   /*
     Force callbacks for alignment to be called   
   */
-  Align_interface::align_to_extents (me, X_AXIS);
+  Align_interface::align_elements_to_extents (me, X_AXIS);
 
   Real pre_space = elems[0]->relative_coordinate (column, X_AXIS);
 
@@ -199,10 +204,33 @@ Break_align_interface::do_alignment (Grob *me)
       stretch_distance = spring_len;
     }
 
+  
   /*
     Hint the spacing engine how much space to put in.
 
     The pairs are in the format of an interval (ie. CAR <  CDR).
+  */
+  /*
+    UGH UGH UGH
+
+    This is a side effect, and there is no guarantee that this info is
+    computed at a "sane" moment.
+
+    (just spent some time tracking a bug that was caused by this info
+    being written halfway:
+
+    self_alignment_callback (*)
+    -> child->relative_coordinate (self)
+    -> break_alignment
+    -> child->relative_coordinate (column)
+
+    the last call incorporates the value that should've been computed
+    in (*), but--of course-- is not yet.
+
+    The result is that an offsets of align_elements_to_extents () are
+    not compensated for, and spring_len is completely off.
+
+    
   */
   column->set_grob_property ("extra-space",
                            scm_cons (gh_double2scm (pre_space),
index 223a7303bb5e21fc89da37dc1c99612cc7f42b59..2aee3603d13b643874daf05d7cea6f0bd53c333d 100644 (file)
@@ -117,7 +117,6 @@ Dynamic_engraver::try_music (Music * m)
            It will disappear by itself when stop_translation_timestep
            () finds that there is nothing to support anymore.  */
          
-         line_spanner_ = 0;
          if (cresc_p_)
            cresc_p_->suicide ();
          cresc_p_ = 0;
index 94d60926c031ba95fe7b5e10250a2648615405d8..643bd531751c77ea2b80ea5811c4ed77cd92d6a4 100644 (file)
@@ -18,7 +18,7 @@ struct Align_interface {
   DECLARE_SCHEME_CALLBACK(alignment_callback, (SCM element, SCM axis));
   DECLARE_SCHEME_CALLBACK(fixed_distance_alignment_callback, (SCM element, SCM axis));
   static void align_to_fixed_distance (Grob*,Axis a);
-  static void align_to_extents (Grob*,Axis a);
+  static void align_elements_to_extents (Grob*,Axis a);
   static void set_axis (Grob*,Axis);
   static Axis axis (Grob*) ;
   static void add_element (Grob*,Grob*, SCM callback);
index b35335cc718c44925289a9c6f1c94e33503fa403..cad76eb68d3e730c94f46ae87e5eece4c380edc2 100644 (file)
@@ -1138,7 +1138,7 @@ shorthand_command_req:
 
 
 verbose_command_req:
-       COMMANDSPANREQUEST bare_int STRING {
+       COMMANDSPANREQUEST bare_int STRING { /*TODO: junkme */
                Span_req * sp_p = new Span_req;
                sp_p-> set_span_dir ( Direction($2));
                sp_p->set_mus_property ("span-type",$3);
index 7633af05f4a20611986733481c613c91d71d8747..f144ba137e4d47fc2522cfba3511afe8136361dc 100644 (file)
@@ -458,8 +458,6 @@ Stem::dim_callback (SCM e, SCM ax)
 }
 
 
-const Real ANGLE = 20* (2.0*M_PI/360.0); // ugh! Should be settable.
-
 
 MAKE_SCHEME_CALLBACK(Stem,brew_molecule,1);
 
@@ -479,10 +477,15 @@ Stem::brew_molecule (SCM smob)
 
   Real dy = Staff_symbol_referencer::staff_space (me)/2.0;
   Real head_wid = 0;
-  
+
+  Real angle =0.0;
   if (Grob *hed = support_head (me))
-    head_wid = hed->extent (hed,X_AXIS).length ();
-  stem_y[Direction(-d)] += d * head_wid * tan(ANGLE)/(2*dy);
+    {
+      head_wid = hed->extent (hed,X_AXIS).length ();
+
+      angle = gh_scm2double (hed->get_grob_property ("attachment-angle"));
+    }
+  stem_y[Direction(-d)] += d * head_wid * tan(angle)/(2*dy);
   
   if (!invisible_b (me))
     {
@@ -502,6 +505,9 @@ Stem::brew_molecule (SCM smob)
   return mol.smobbed_copy ();
 }
 
+/*
+  move the stem to right of the notehead if it is up.
+ */
 MAKE_SCHEME_CALLBACK(Stem,off_callback,2);
 SCM
 Stem::off_callback (SCM element_smob, SCM )
@@ -518,7 +524,7 @@ Stem::off_callback (SCM element_smob, SCM )
       
       Real rule_thick = gh_scm2double (me->get_grob_property ("thickness")) * me->paper_l ()->get_var ("stafflinethickness");
       Direction d = get_direction (me);
-      r = head_wid[d] - d * rule_thick ;
+      r = head_wid[d] - d * rule_thick * 0.5;
     }
   return gh_double2scm (r);
 }
index 9190111b3449b485f18f6a339b3a3657b10774af..cebdb1a2820b68fb02311efeab04f9979993cbd4 100644 (file)
@@ -1,15 +1,15 @@
 Begin3
 Title: LilyPond
-Version: 1.3.131
-Entered-date: 24FEB01
+Version: 1.3.132
+Entered-date: 26FEB01
 Description: @BLURB@
 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.131.tar.gz 
+       1000k lilypond-1.3.132.tar.gz 
 Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
-       1000k lilypond-1.3.131.tar.gz 
+       1000k lilypond-1.3.132.tar.gz 
 Copying-policy: GPL
 End
index 08f2e52e8b7bf27a7d1fd23f32670193753a46e0..db222e14efb48b0d1825dd0a44bf96119ef10f3f 100644 (file)
@@ -1,11 +1,11 @@
 %define info yes
 
 Name: lilypond
-Version: 1.3.131
+Version: 1.3.132
 Release: 1
 License: GPL
 Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.131.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.132.tar.gz
 Summary: A program for printing sheet music.
 URL: http://www.cs.uu.nl/~hanwen/lilypond
 # Icon: lilypond-icon.gif
index 34eb038cba97b3f3edb1274e00299af24cb0ea30..d1a656133d7b995c8b0325819127b312d73c47e2 100644 (file)
@@ -11,9 +11,6 @@ clarinettiStaff = \context Staff = clarinetti <
          "2 Clarinetti" (rows "(B" ,text-flat ")"))
        
        \property Staff.instr = #`(lines "Cl."  (rows "(B" ,text-flat ")"))
-
-       % urg: can't; only My_midi_lexer:<non-static> () parses pitch?
-       %\property Staff.transposing = "bes"
        \property Staff.transposing = #-2
        
        \Time
index 0bdc166596ee3652565bece3c2bdc5079a45793e..b4fe792cc642cac05b41888069cdfdcc24a84021 100644 (file)
@@ -11,9 +11,6 @@ corniStaff = \context Staff = corni <
          "2 Corni" (rows "(E" ,text-flat ")"))
        
        \property Staff.instr = #`(lines "Cor."  (rows "(E" ,text-flat ")"))
-
-       % urg: can't; only My_midi_lexer:<non-static> () parses pitch?
-       %\property Staff.transposing = "es"
        \property Staff.transposing = #3
        \Time
        \notes { \key c \major; }
index 7e814f043921df7c81c276c64702a2d92dd86efc..5c9e37c15137921e50e9d8cff8b91def71f59d0f 100644 (file)
@@ -87,7 +87,6 @@
                (breakable . #t)
                (stacking-dir . 1)
                (axes 0)
-               (X-offset-callbacks . (,Break_align_interface::self_align_callback))
                (space-alist . ,default-break-align-space-alist) 
                (meta . ,(grob-description "BreakAlignment"
                        axis-group-interface align-interface
        (NoteHead . (
                (style . default)
                (molecule-callback . ,Note_head::brew_molecule)
-               (Y-offset-callbacks  . (,Staff_symbol_referencer::callback)) 
+               (Y-offset-callbacks  . (,Staff_symbol_referencer::callback))
+               (attachment-angle . ,(* 20/360 3.14159))
                (meta . ,(grob-description  "NoteHead"
                        rhythmic-head-interface font-interface 
                        note-head-interface ))
index 67f74adc87eb247dedc000983577d087d5bd6483..0430b0f73e582db87e768f4973c05c8edaf9fdde 100644 (file)
@@ -37,6 +37,8 @@ This procedure is called (using dependency resolution) after line breaking. Retu
 (grob-property-description 'arithmetic-multiplier number? "see @ref{spacing-spanner-interface}.")
 (grob-property-description 'attachment pair? "cons of symbols, '(LEFT-TYPE . RIGHT-TYPE), where both types may be alongside-stem, stem, head or loose-end.")
 
+(grob-property-description 'attachment-angle number? "Where does the stem
+attach to the notehead?")
 (grob-property-description 'attachment-offset pair? "cons of offsets,
 '(LEFT-offset . RIGHT-offset).  This offset is added to the
 attachments to prevent ugly slurs.  [fixme: we need more documentation here].
@@ -115,7 +117,11 @@ Align_interface::center_on_element). .")
 (grob-property-description 'expand-limit integer? "maximum number of measures expanded in church rests.")
 (grob-property-description 'extra-extent-X number-pair? "enlarge in X dimension by this much, measured in staff space.")
 (grob-property-description 'extra-extent-Y number-pair? "see @code{extra-extent-Y}.")
-(grob-property-description 'extra-offset number-pair? "pair of reals (a cons) forcing an extra offset   before outputting.")
+(grob-property-description 'extra-offset number-pair? "pair of reals
+(a cons) forcing an extra offset before outputting.
+@code{extra-offset} is added just before `printing' the grob, so the
+typesetting engine is completely oblivious to it.
+")
 (grob-property-description 'extra-space number-pair? "pair of distances (cons LEFT RIGHT).")
 (grob-property-description 'extremity-offset-alist list? "an alist (attachment stem-dir*dir slur-dir*dir) -> offset.  The offset adds to the centre of the notehead, or stem.")
 
index e7253de63f084ae1ab491e50345c0c037127cb14..d6571b3a80a7715eba00977bf5c1c7bfe71797da 100644 (file)
@@ -217,7 +217,7 @@ object."
    'note-head-interface
    "Note head"
    '(
-    style 
+    style  attachment-angle
     )
    ))
 
index 1f0e15218cbcf6f66cbc06b3776ed5d577afaabb..754ab1cc00e77ab8e6578b81cc6d6ebd31029ddb 100644 (file)
@@ -744,12 +744,8 @@ either unison, unisilence or soloADue is set"
     (engraver-description
      "Tuplet_engraver"
      "Catch Time_scaled_music and generate appropriate bracket  "
-     '(
-       TupletBracket)
-     '(
-      tupletSpannerDuration
-      tupletInvisible
-      )))
+     '( TupletBracket)
+     '(tupletNumberFormatFunction tupletSpannerDuration tupletInvisible)))
 
 
    (cons
index 610f63a2988075fe5ecbcaed8ae27304af9b8176..3c62246ac1f3d0e206599bee8c2ce45a76d5e90a 100644 (file)
@@ -152,7 +152,13 @@ Staff.defaultBarType will have no effect.
 if they change.
 ")
 (translator-property-description 'explicitClefVisibility procedure? "visibility-lambda function for clef changes.")
-(translator-property-description 'explicitKeySignatureVisibility procedure? "visibility-lambda function for explicit Key changes.")
+
+(translator-property-description 'explicitKeySignatureVisibility
+procedure? "visibility-lambda function for explicit Key changes;
+\override of #'visibility-lambda will set the visibility for normal
+(ie. at the start of the line) key signatures.")
+
+
 (translator-property-description 'followThread boolean?
                                 "if set, note heads are tracked  across staff switches by a thin line")
 (translator-property-description 'forceClef boolean? "Show clef symbol, even if it hasn't changed.")
index 0655a4f84e2816fff5d45ec9ee0ecc92c6984142..5586f5f36dc0a7441458bb4725dc330173c173f8 100755 (executable)
@@ -1137,7 +1137,7 @@ fi
        PATHSEP=':'
        INSTALL="\$(SHELL) \$(stepdir)/../bin/install-dot-exe.sh -c"
     else
-       ROOTSEP='/'
+       ROOTSEP=':'
        DIRSEP='/'
        PATHSEP=':'
        LN=ln