]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.2.5
authorfred <fred>
Tue, 26 Mar 2002 22:25:18 +0000 (22:25 +0000)
committerfred <fred>
Tue, 26 Mar 2002 22:25:18 +0000 (22:25 +0000)
53 files changed:
CHANGES
Documentation/COPERTINA.yo
Documentation/FLAPTEKST.yo
Documentation/metadoc/GNUmakefile
Documentation/tex/GNUmakefile
Documentation/tex/mudela-book-doc.doc
Documentation/tex/reference-manual.tely [new file with mode: 0644]
Documentation/tex/regression-test.tely [new file with mode: 0644]
Documentation/tex/tutorial.tely [new file with mode: 0644]
Documentation/topdocs/INSTALL.texi [new file with mode: 0644]
Documentation/topdocs/PATCHES.texi [new file with mode: 0644]
Documentation/topdocs/README.texi [new file with mode: 0644]
Documentation/topdocs/index.tely [new file with mode: 0644]
NEWS
TODO
aclocal.m4
config.make.in
configure
input/bugs/addlyrmus.fly [new file with mode: 0644]
input/bugs/dots.fly
input/bugs/hinterfleisch-gone.ly
input/bugs/l.ly [new file with mode: 0644]
input/bugs/utremi_old.ly [new file with mode: 0644]
input/test/repeat-semifold.ly
lily/crescendo.cc
lily/include/score-element.hh
lily/include/spanner.hh
lily/multi-measure-rest.cc
lily/note-heads-engraver.cc
lily/paper-stream.cc
lily/repeated-music.cc
lily/rest-engraver.cc
lily/slur.cc
lily/spacing-spanner.cc
lily/spanner.cc
lily/staff-side.cc
lily/tie.cc
lily/volta-spanner.cc
make/mudela-rules.make
make/mudela-targets.make
make/mudela-vars.make
ps/lily.ps
scm/lily.scm
scripts/mudela-book.py
stepmake/aclocal.m4
stepmake/bin/add-html-footer.py
stepmake/bin/ls-latex.py
stepmake/bin/package-diff.py
stepmake/bin/packagepython.py
stepmake/bin/table-to-html.py
stepmake/stepmake/texinfo-targets.make [new file with mode: 0644]
stepmake/stepmake/texinfo-vars.make [new file with mode: 0644]
tex/lily-ps-defs.tex

diff --git a/CHANGES b/CHANGES
index 8fa3170237c8d612fdd784105290b2aba3a14a64..2f0e5efd8d4db9e078230183364b66151bfffffe 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,12 @@
+pl 4.hwn1
+       - bf: repeats.
+       - bf: mmrests
+       - bf: simpler guile detection.
+       - use texinfo for reference manual.
+       - inline lily.ps from lilypond.
+       - texi for doco: converted directory Documentation/tex/
+
+
 pl 3.hwn1
        - mudela-book tweaks for surviving texinfo
        - include feta  command seqs. in .tex 
@@ -12,8 +21,6 @@ extent () is given relative to this.
        - bf: Rhythmic_head::do_substitute_element_pointer ()
        - Direct access to dim_cache_ replaced by methods in
 Graphical_element.
-3.mk1
-       - left endings of various spanners adjusted
 
 **********
 
index dd4c568b46e5f6f8f551c61c59ff25913663ffe9..af415d654b28ab272f11e4a514434cab34df28de 100644 (file)
@@ -5,5 +5,4 @@ nsect(LilyPond 
 
 includefile(COPERTINA.in)
 nl()
-pic(schermo)
 
index b144222cebd273a539d9672221d94dc69110108b..ced2a0271eaa5b2ed931e1d26afbb76ec19157e0 100644 (file)
@@ -1,9 +1,5 @@
-COMMENT(silly...DEFINEMACRO(pic)(1)(url(ARG1)(ARG1.png)))
-DEFINEMACRO(pic)(1)(verbinclude(ARG1.in))
-
 nsect(LilyPond -- De Muziek Zetter van het GNU Project)
 
 includefile(FLAPTEKST.in)
 nl()
-pic(scherm)
 
index ebce9188b1add1fe3358096df69fa9ed26e363f2..2df6d428285f6761fec27027967fc3663cb0c561 100644 (file)
@@ -6,19 +6,17 @@ DATA_FILES = $(wildcard *.data)
 datafiles = $(addprefix $(outdir)/,$(DATA_FILES:.data=.html))
 TEX_FILES = $(wildcard *.tex)
 DOC_FILES = $(wildcard *.doc)
-TELY_FILES = $(wildcard *.tely)
-DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi) $(YO_FILES:.yo=.dvi) $(TELY_FILES:.tely=.dvi))
+
+DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi)  $(TELY_FILES:.tely=.dvi))
 OUT_BIB_FILES = $(addprefix $(outdir)/, $(BIB_FILES))
 
-# just include me
-YO_URG_FILES = $(wildcard *.yo-urg)
 
 OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
 OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
 EL_FILES = $(wildcard *.el)
 BIB_FILES= $(wildcard *.bib)
-EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(TELY_FILES) $(wildcard *.sty) 
-HTML_FILES = $(addprefix $(outdir)/, $(YO_FILES:.yo=.html) $(TELY_FILES:.tely=.html))
+EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES)  $(TEX_FILES) $(wildcard *.sty) 
+HTML_FILES = $(addprefix $(outdir)/,  $(TELY_FILES:.tely=.html))
 PS_FILES = $(DVI_FILES:.dvi=.ps)
 
 STEPMAKE_TEMPLATES=tex documentation
@@ -53,9 +51,9 @@ $(outdir)/%.tex: %.data $(depth)/VERSION
 
 
 
-local-WWW: $(HTML_FILES) $(OUTTEX_FILES:.doc=.ps.gz) $(OUTYO_FILES:.yo=.latex) $(OUTYO_FILES:.yo=.ps.gz) $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html)) $(datafiles) ps
+local-WWW-donotdoit: $(HTML_FILES) $(OUTTEX_FILES:.doc=.ps.gz)  $(addprefix $(outdir)/, $(BIB_FILES:.bib=.html)) $(datafiles) ps
        $(PYTHON) $(step-bindir)/ls-latex.py --package=$(topdir) --title 'LaTeX documents about design and implementation of LilyPond' \
-         $(TELY_FILES) $(YO_FILES) $(OUTYO_FILES:.yo=.latex) $(BIB_FILES) $(DOC_FILES) $(TEX_FILES)\
+         $(TELY_FILES)  $(BIB_FILES) $(DOC_FILES) $(TEX_FILES)\
          | sed "s!$(outdir)/!!g" > $(outdir)/index.html
          $(PYTHON) $(step-bindir)/add-html-footer.py --package=$(topdir) $(outdir)/index.html
 
index 6fd3cf7762bbc1aaf2a449a8d095b76b0aa1b749..fd0723e714acc873b62874a54d5e760d84215a99 100644 (file)
@@ -6,20 +6,20 @@ DATA_FILES = $(wildcard *.data)
 datafiles = $(addprefix $(outdir)/,$(DATA_FILES:.data=.html))
 TEX_FILES = $(wildcard *.tex)
 DOC_FILES = $(wildcard *.doc)
-TELY_FILES = $(wildcard *.tely)
-DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi) $(YO_FILES:.yo=.dvi) $(TELY_FILES:.tely=.dvi))
 
-# just include me
-YO_URG_FILES = $(wildcard *.yo-urg)
+DVI_FILES = $(addprefix $(outdir)/,$(DOC_FILES:.doc=.dvi)  $(TELY_FILES:.tely=.dvi))
+
+
 
-OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
 OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
+OUTTEX_FILES = $(addprefix $(outdir)/, $(TEX_FILES))
+
+EXTRA_DIST_FILES= $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(TEX_FILES) testje.fly
+HTML_FILES = $(addprefix $(outdir)/, $(TELY_FILES:.tely=.html))
 
-EXTRA_DIST_FILES= $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(TELY_FILES) testje.fly
-HTML_FILES = $(addprefix $(outdir)/, $(YO_FILES:.yo=.html) $(TELY_FILES:.tely=.html))
 PS_FILES = $(DVI_FILES:.dvi=.ps)
 
-STEPMAKE_TEMPLATES=tex documentation
+STEPMAKE_TEMPLATES=tex texinfo documentation
 LOCALSTEPMAKE_TEMPLATES=lilypond mudela
 
 include $(depth)/make/stepmake.make 
@@ -42,31 +42,24 @@ OUTGENHTMLS = $(addprefix $(outdir)/, $(GENHTMLS:%=%.html))
 #urg should generalise and move Lilypond -> StepMake
 # URG.  Lilypond specific. Move out. 
 $(outdir)/%.html: %.data $(depth)/VERSION
-       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r' --package=$(topdir) -o $@ $<
+       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r' -o $@ $<
        $(PYTHON) $(step-bindir)/add-html-footer.py --package=$(topdir) $@
 
-$(outdir)/%.tex: %.data $(depth)/VERSION
-       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r' --package=$(topdir) -o $@ --latex $<
+$(outdir)/%.latex: %.data $(depth)/VERSION
+       $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep='\r'  -o $@ --format=latex $<
+
 
 
-$(outdir)/glossary.dvi: $(outdir)/glossary-table.tex
-$(outdir)/glossary.html: $(outdir)/glossary-table.html
 
 
-local-WWW: $(HTML_FILES) $(OUTDOC_FILES:.doc=.ps.gz) $(OUTTEX_FILES:.tex=.ps.gz) $(OUTYO_FILES:.yo=.latex) $(OUTYO_FILES:.yo=.ps.gz)  $(datafiles)
+local-WWW: $(HTML_FILES) $(OUTDOC_FILES:.doc=.ps.gz) $(OUTTEX_FILES:.tex=.ps.gz)   $(datafiles)
        $(PYTHON) $(step-bindir)/ls-latex.py --package=$(topdir) --title 'LaTeX documents about LilyPond' \
-         $(YO_FILES) $(OUTYO_FILES:.yo=.latex) $(BIB_FILES) $(DOC_FILES) $(TEX_FILES)\
+          $(DOC_FILES) $(TEX_FILES)\
          | sed "s!$(outdir)/!!g" > $(outdir)/index.html
          $(PYTHON) $(step-bindir)/add-html-footer.py --package=$(topdir) $(outdir)/index.html
 
 $(outdir)/%.bib: %.bib
        ln -f $< $@
 
-# Yeah right: 
-# make -k out/mudela.dvi => cp -f out/vocabulary.tex out/mudela.dvi
-
-#out/%: $(outdir)/%
-#      cp -f $< $@
-
 localclean:
        rm -f fonts.aux fonts.log feta*.tfm feta*.*pk
index 46c2423c9bd2400d87ced16ef1a2df6273deba13..e4afd2e915d5f9c9aeaa7092eb5989ab73d2f875 100644 (file)
@@ -16,6 +16,8 @@
 
 \section{Introduction}
 
+[TODO: THIS MANUAL IS OUTDATED. FIXME.]
+
 Mudela-book is a script that process your \LaTeX~file and with great
 help from GNU LilyPond it translates blocks of mudela code it finds
 inside \verb|mudela| environments to tex or eps graphics. It then
diff --git a/Documentation/tex/reference-manual.tely b/Documentation/tex/reference-manual.tely
new file mode 100644 (file)
index 0000000..f8a4f3b
--- /dev/null
@@ -0,0 +1,4221 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename reference-manual.info
+@settitle LilyPond 1-2-0 Reference Manual
+
+@ifinfo
+
+This is the reference documentation to LilyPond.  It is not a tutorial.
+It was written by Han-Wen Nienhuys, Adrian Mariano and Jan Nieuwenhuizen
+
+
+Copyright 1999 by its authors.
+@end ifinfo
+
+@titlepage
+@sp 10
+@comment The title is printed in a large font.
+@center @titlefont{LilyPond Reference manual}
+@vskip 20pt
+@center @titlefont{Han-Wen Nienhuys, Adrian Mariano, Jan Nieuwenhuizen}
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1999 by its authors
+@end titlepage
+
+
+@node Top, , Running LilyPond, (dir)
+@top
+@menu
+* LilyPond 1-2-0 Reference Manual::LilyPond 1-2-0 Reference Manual
+@end menu
+
+
+@node LilyPond 1-2-0 Reference Manual, Overview, , Top
+@menu
+* Overview::                      Overview
+* Top level::                     Top level
+* notenames::                     notenames
+* Lexical conventions::           Lexical conventions
+* notelang::                      notelang
+* modes::                         modes
+* Types::                         Types
+* Music expressions::             Music expressions
+* Atomic music expressions::      Atomic music expressions
+* atomicmusic::                   atomicmusic
+* notedesc::                      notedesc
+* barlines::                      barlines
+* manualbeam::                    manualbeam
+* tremolo::                       tremolo
+* Compound music expressions::    Compound music expressions
+* compoundmusic::                 compoundmusic
+* relative::                      relative
+* sec-repeats::                   sec-repeats
+* transpose::                     transpose
+* Ambiguities::                   Ambiguities
+* Notation conversion specifics:: Notation conversion specifics
+* autobeam::                      autobeam
+* lyricprint::                    lyricprint
+* Notation Contexts::             Notation Contexts
+* contextselection::              contextselection
+* Notation output definitions::   Notation output definitions
+* output::                        output
+* paper::                         paper
+* papervars::                     papervars
+* contextdefs::                   contextdefs
+* engravers::                     engravers
+* Sound output::                  Sound output
+* midilist::                      midilist
+* Pre-defined Identifiers::       Pre-defined Identifiers
+* ident::                         ident
+* Running LilyPond::              Running LilyPond
+@end menu
+@chapter LilyPond 1.2.0 Reference Manual
+
+
+@node Overview, Top level, LilyPond 1-2-0 Reference Manual, LilyPond 1-2-0 Reference Manual
+@section Overview
+
+This document@footnote{This document has been revised for
+LilyPond 1.2.} describes the the GNU LilyPond input format, which is
+a language for defining music.  We call this language @emph{Music
+Definition Language} or @emph{Mudela}, for short.@footnote{If anybody
+comes up with a better name, we'd gladly take this.  Gourlay already
+uses a ``Musical Description Language,'' ISO standard 10743 defines a
+``Standard Music Description Language.''  We're not being original
+here.}
+
+@emph{Mudela} is a language that allows you to
+
+@itemize @bullet
+  @item  create musical expressions by combining pitches, durations 
+  @item  output those musical expressions to various formats
+  @item  give those musical expressions and output definitions names, so
+       you can enter them in manageable chunks.
+@end itemize
+
+@emph{Mudela} aims to define a piece of music completely, both from
+typesetting and from a performance point of view.
+
+
+
+@node Top level, notenames, Overview, LilyPond 1-2-0 Reference Manual
+@section Top level
+
+@cindex top level
+
+This section describes what you may enter at top level.
+
+
+
+@cindex score definition
+
+The output is generated combining a music expression with an output
+definition.  A score block has the following syntax:
+
+@quotation
+
+  @code{\score @{}   @code{@}}
+@end quotation
+
+ are zero or more output definitions.  If no output
+definition is supplied, the default @code{\paper} block will be added.
+
+
+
+@cindex header
+
+@cindex header@@@code{\header}
+
+The syntax is
+
+@quotation
+
+  @code{\header} @code{@{}  = ;
+                         = ; ... @code{@}}
+@end quotation
+
+A header describes the file's contents.  It can also appear in a
+@code{\score} block.  Tools like @code{ly2dvi}
+@cindex ly2dvi@@@code{ly2dvi}
+ can use this
+information for generating titles.  Key values that are used by
+@code{ly2dvi} are: title, subtitle, composer, opus, poet, instrument,
+metre, arranger, piece and tagline.
+
+It is customary to put the @code{\header} at the top of the file.
+
+
+@node notenames, Lexical conventions, Top level, LilyPond 1-2-0 Reference Manual
+
+Note name tables can be specified using
+
+@quotation
+
+  @code{\notenames}
+@cindex notenames@@@code{\notenames}
+
+    @code{@{}  @code{@}}
+@end quotation
+
+ is a list of definitions of the form
+
+@quotation
+
+   = 
+@end quotation
+
+Chord modifiers can be set analogously, with
+@code{\chordmodifiers}
+@cindex chordmodifiers@@@code{\chordmodifiers}
+.
+
+
+
+A @code{\paper} block at top level sets the default paper block.  A
+@code{\midi} block at top level works similarly.
+
+
+
+LilyPond contains a Scheme interpreter (the GUILE library) for
+internal use.  The following commands access the interpreter
+directly.
+
+@quotation
+
+  @code{\scm}
+@cindex scm@@@code{\scm}
+  @code{;}
+@end quotation
+
+Evaluates the specified Scheme code.  The result is discarded.
+
+@quotation
+
+  @code{\scmfile}
+@cindex scmfile@@@code{\scmfile}
+  @code{;}
+@end quotation
+
+Reads Scheme code from the specified file.  The result is discarded.
+
+
+
+Identifier assignments may appear at top level.  Semicolons are
+forbidden after top level assignments.
+
+
+
+@node Lexical conventions, notelang, notenames, LilyPond 1-2-0 Reference Manual
+@section Lexical conventions
+
+@cindex lexical conventions
+
+
+
+@cindex comment
+
+@cindex %@@@code{%}
+
+
+A one line comment is introduced by a `@code{%}' character. 
+Block comments are started by `@code{%@{}' and ended by `@code{%@}}'. 
+They cannot be nested.
+
+
+
+@cindex keyword
+
+Keywords start with a backslash, followed by a number of lower case
+alphabetic characters.  These are all the keywords.
+
+@quotation
+
+  @code{\accepts}
+  @code{\addlyrics}
+  @code{\alternative}
+  @code{\bar}
+  @code{\breathe}
+  @code{\cadenza}
+  @code{\chordmodifiers}
+  @code{\chords}
+  @code{\clef}
+  @code{\cm}
+  @code{\consists}
+  @code{\consistsend}
+  @code{\context}
+  @code{\duration}
+  @code{\font}
+  @code{\grace}
+  @code{\header}
+  @code{\in}
+  @code{\key}
+  @code{\keysignature}
+  @code{\lyrics}
+  @code{\mark}
+  @code{\midi}
+  @code{\mm}
+  @code{\musicalpitch}
+  @code{\name}
+  @code{\notenames}
+  @code{\notes}
+  @code{\paper}
+  @code{\partial}
+  @code{\penalty}
+  @code{\property}
+  @code{\pt}
+  @code{\relative}
+  @code{\remove}
+  @code{\repeat}
+  @code{\repetitions}
+  @code{\scm}
+  @code{\scmfile}
+  @code{\score}
+  @code{\script}
+  @code{\sequential}
+  @code{\shape}
+  @code{\simultaneous}
+  @code{\skip}
+  @code{\spanrequest}
+  @code{\tempo}
+  @code{\textscript}
+  @code{\time}
+  @code{\times}
+  @code{\translator}
+  @code{\transpose}
+  @code{\type}
+@end quotation
+
+
+
+
+@cindex integer
+
+Formed from an optional minus sign followed by digits.  Arithmetic
+operations cannot be done with integers, and integers cannot be mixed
+with reals.
+
+
+
+@cindex real
+
+Formed from an optional minus sign and a sequence of digits followed
+by a @emph{required} decimal point and an optional exponent such as
+@code{-1.2e3}.  Reals can be built up using the usual operations:
+`@code{+}
+@cindex +@@@code{+}
+', `@code{-}
+@cindex -@@@code{-}
+', `@code{*}
+@cindex *@@@code{*}
+', and
+`@code{/}
+@cindex /@@@code{/}
+', with parentheses for grouping.
+
+A real constant can be followed by one of the dimension
+keywords:
+@cindex dimensions
+ @code{\mm}
+@cindex mm@@@code{\mm}
+,
+@code{\pt}
+@cindex pt@@@code{\pt}
+, @code{\in}
+@cindex in@@@code{\in}
+, or
+@code{\cm}
+@cindex cm@@@code{\cm}
+, for millimeters, points, inches and
+centimeters, respectively.  This converts the number to a real that
+is the internal representation of dimensions.
+
+
+
+@cindex string
+
+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 section @xref{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 can appear
+anywhere.
+
+@quotation
+
+  @code{\maininput}
+@cindex maininput@@@code{\maininput}
+
+@end quotation
+
+This command is used in init files to signal that the user file must
+be read. This command cannot be used in a user file.
+
+@quotation
+
+  @code{\include}
+@cindex include@@@code{\include}
+@end quotation
+
+Include .  The argument  may be a quoted string (an
+unquoted string will not work here!) or a string identifier.  The full
+filename including the @file{.ly} extension must be given,
+
+@quotation
+
+  @code{\version}
+@cindex version@@@code{\version}
+  @code{;}
+@end quotation
+
+Specify the version of LilyPond that a file was written for.  The
+argument is a version string in quotes, for example @code{"1.2.0"}. 
+This is used to detect invalid input, and to aid
+@code{convert-mudela}, a tool that automatically upgrades input files.
+
+
+
+@cindex other languages
+
+@node notelang, modes, Lexical conventions, LilyPond 1-2-0 Reference Manual
+
+Note name definitions have been provided in various languages. 
+Simply include the language specific init file.  For example:
+`@code{\include "english.ly"}'.  The available language files and the
+names they define are:
+
+@quotation
+
+@example 
+                        Note Names               sharp       flat
+
+nederlands.ly  c   d   e   f   g   a   bes b   -is         -es
+english.ly     c   d   e   f   g   a   bf  b   -s/-sharp   -f/-flat
+deutsch.ly     c   d   e   f   g   a   b   h   -is         -es
+norsk.ly       c   d   e   f   g   a   b   h   -iss/-is    -ess/-es
+svenska.ly     c   d   e   f   g   a   b   h   -iss        -ess
+italiano.ly    do  re  mi  fa  sol la  sid si  -d          -b
+catalan.ly     do  re  mi  fa  sol la  sid si  -d/-s       -b 
+@end example 
+
+@end quotation
+
+Pitch names can be redefined using the
+@code{\notenames}
+@cindex notenames@@@code{\notenames}
+ command, see
+subsection @xref{notenames}.
+
+
+
+@cindex lexical modes
+
+@cindex modes
+
+@node modes, Types, notelang, LilyPond 1-2-0 Reference Manual
+
+To simplify entering notes, lyrics, and chords, @emph{Mudela} 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 @samp
+  @item Normal mode.
+@cindex mode!normal
+    At the start of parsing, @emph{Mudela} 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.
+@cindex mode!note
+
+    Note mode is introduced by the keyword
+    @code{\notes}
+@cindex notes@@@code{\notes}
+.  In Note mode, words can only
+    contain alphabetic characters.  If @code{word} is encountered,
+    LilyPond first checks for a notename of @code{word}.  If no
+    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.
+
+  @item Chord mode.
+@cindex mode!chord
+
+    Chord mode is introduced by the keyword
+    @code{\chords}
+@cindex chords@@@code{\chords}
+.  It is similar to Note mode, but
+    words are also looked up in a chord modifier table (containing
+    @code{maj}, @code{dim}, etc).
+
+    Since combinations of numbers and dots are used for indicating
+    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.
+
+  @item Lyrics mode. 
+@cindex mode!lyric
+
+    Lyrics mode is introduced by the keyword
+    @code{\lyrics}
+@cindex lyrics@@@code{\lyrics}
+.  This mode has rules that make it
+    easy to include punctuation and diacritical marks in words.  A
+    word in Lyrics mode begins with: an alphabetic character,
+    `@code{_}', `@code{?}', `@code{!}', `@code{:}', `@code{'}', the
+    control characters @code{^A} through @code{^F}, @code{^Q} through
+    @code{^W}, @code{^Y}, @code{^^}, any 8-bit character with ASCII code
+    over 127, or a two-character combination of a backslash followed
+    by one of `@code{`}', `@code{'}', `@code{"}', or
+    `@code{^}'.@footnote{The purpose of Lyrics mode is that you can
+    enter lyrics in TeX format or a standard encoding without
+    needing quotes.  The precise definition of this mode indeed is
+    ludicrous.  This will remain so until the authors of LilyPond
+    acquire a deeper understanding of character encoding, or someone
+    else steps up to fix this.}
+
+    Subsequent characters of a word can be any character that is not
+    a digit and not white space.  One important consequence of this
+    is that a word can end with `@code{@}}', which may be confusing if
+    you thought the closing brace was going to terminate Lyrics
+    mode.@footnote{LilyPond will issue a warning, though.}  Any
+    `@code{_}' characters which appear in an unquoted word are
+    converted to spaces.  This provides a mechanism for introducing
+    spaces into words without using quotes.  Quoted words can also be
+    used in Lyrics mode to specify words that cannot be written with
+    the above rules.  Here are some examples.  Not all of these words
+    are printable by TeX.
+
+
+    @quotation
+
+@example 
+Ah!             % a word
+2B_||_!2B       % not a word because it starts with a digit
+``Hello''       % not a word because it starts with `
+_ _ _ _         % 4 words, each one a space 
+@end example 
+
+    @end quotation
+
+    Since combinations of numbers and dots are used for indicating
+    durations, you can not enter real numbers in this mode.
+@end table
+
+It is possible to create words that break the rules by prefixing them
+with the dollar sign `@code{$}
+@cindex $@@@code{$}
+'.  Regardless of the context, a
+word beginning with `@code{$}' extends until the next white space
+character.  Such words can contain numbers (even in Note mode), or
+other forbidden characters.  The dollar sign can be used to create
+and access identifiers that could not otherwise be used.@footnote{Use
+of `@code{$}' hampers readability and portability to future LilyPond
+versions, thus the use of the dollar sign is discouraged.}
+
+
+
+@node Types, Music expressions, modes, LilyPond 1-2-0 Reference Manual
+@section Types
+
+@cindex types and identifiers
+
+@emph{Mudela} has a limited set of types:
+
+@itemize @bullet
+  @item  integers
+  @item  reals
+  @item  strings
+  @item  music expressions
+  @item  durations of notes and rests (specified with
+       @code{\notenames}
+@cindex notenames@@@code{\notenames}
+)
+  @item  note name tables
+  @item  context definitions, part of output definitions.  See
+       section @xref{contextdefs} for more information
+  @item  output definitions (like @code{\paper}
+@cindex paper@@@code{\paper}
+ blocks
+       and @code{\midi}
+@cindex midi@@@code{\midi}
+ blocks)
+  @item  score definitions (@code{\score}
+@cindex score@@@code{\score}
+ blocks)
+@end itemize
+
+Type is a syntactical property: @emph{Mudela} has no real type system,
+so there is no support for generic expressions, functions, or user
+defined types.  For the same reason, it is not possible to mix reals
+and integers in arithmetic expressions, and ``type
+errors''
+@cindex type error
+ (e.g., using a string identifier to
+initialize a @code{\paper}
+@cindex paper@@@code{\paper}
+ block) will yield a ``parse
+error''.
+
+Identifiers allow objects to be assigned to names.  To assign an
+identifier, you use `=' and to refer to an
+identifier, you preceed its name with a backslash:
+`@code{\}'.  Identifier assignments must appear at top level
+in the @emph{Mudela} file.  Semicolons are forbidden after assignments
+appearing at top level but they are obligatory after assignments
+appearing in the @code{\paper} block, see Section @xref{paper}.
+
+ is any of the types listed above.
+
+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 whose name is the same as the name of a keyword.
+
+The right hand side of an identifier assignment is parsed completely
+before the assignment is done, so it is allowed to redefine an
+identifier in terms of its old value, e.g.
+
+@quotation
+
+  @code{foo = \foo * 2.0}
+@end quotation
+
+When an identifier is referenced, the information it points to is
+copied.  Therefore it only makes sense to put identifiers for
+translators, output definitions, and @code{\score}
+@cindex score@@@code{\score}
+
+blocks as the first item in a block.  For this reason, if you
+reference a @code{\foo} variable in a @code{\foo} block, it must be the
+first item in the list following @code{\foo}.@footnote{@code{\paper@{\one
+\two@}} does not make sense, because the information of @code{\two}
+would overwrite the information of @code{\one}, thereby making the
+reference to the first identifier useless.}
+
+
+
+@node Music expressions, Atomic music expressions, Types, LilyPond 1-2-0 Reference Manual
+@section Music expressions
+
+@cindex music expressions
+
+Music in @emph{Mudela} 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:
+
+@quotation
+
+  @example 
+\sequential @{ c4 d4 @} 
+@end example 
+
+@end quotation
+
+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 @xref{atomicmusic}.  Compound music expressions are
+discussed in subsection @xref{compoundmusic}.
+
+
+
+@node Atomic music expressions, atomicmusic, Music expressions, LilyPond 1-2-0 Reference Manual
+@section Atomic music expressions
+@node atomicmusic, notedesc, Atomic music expressions, LilyPond 1-2-0 Reference Manual
+
+
+
+@cindex pitch
+
+@cindex duration
+
+The syntax for pitch specification is
+
+@quotation
+
+  @code{\musicalpitch}
+@cindex musicalpitch@@@code{\musicalpitch}
+
+    @code{@{}    @code{@}}
+@end quotation
+
+ is specified by an integer, zero for the octave
+containing middle C.   is a number from 0 to 7, with 0
+corresponding to C and 7 corresponding to B.  The shift is zero for a
+natural, negative to add flats, or positive to add sharps.
+
+In Note and Chord mode, pitches may be designated by names.  See
+section @xref{notelang} for pitch names in different languages.
+
+The syntax for duration specification is
+
+@quotation
+
+  @code{\duration}
+@cindex duration@@@code{\duration}
+
+    @code{@{}   @code{@}}
+@end quotation
+
+ 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
+.
+
+In Note, Chord, and Lyrics mode, durations may be designated by
+numbers and dots.  See Section @xref{notelang} for details.
+
+
+@node notedesc, barlines, atomicmusic, LilyPond 1-2-0 Reference Manual
+
+@cindex note specification
+
+@cindex pitches
+
+@cindex entering notes
+
+A note specification has the form
+
+@quotation
+
+  [][@code{!}][@code{?}][]
+@end quotation
+
+The pitch of the note is specified by the note's name.
+
+
+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 Dutchcindex(notenames!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 obtained by adding
+`@code{-isis}' or `@code{-eses}'.  `@code{aes}' and `@code{ees}' are
+contracted to `@code{as}' and `@code{es}' in Dutch, but both forms will
+be accepted.
+
+LilyPond has predefined sets of notenames for various languages.  See
+section @xref{notelang} for details.
+
+
+The optional octave specification takes the form of a series of
+single quote (`@code{'}
+@cindex '@@@code{'}
+') characters or a series of comma
+(`@code{,}
+@cindex ,@@@code{,}
+') characters.  Each @code{'} raises the pitch by one
+octave; each @code{,} lowers the pitch by an octave.
+
+@mudela[fragment,verbatim,center]
+  c' d' e' f' g' a' b' c''
+@end mudela
+
+@mudela[fragment,verbatim,center]
+  cis' dis' eis' fis' gis' ais' bis'
+@end mudela
+
+@mudela[fragment,verbatim,center]
+  ces' des' es' fes' ges' as' bes'
+@end mudela
+
+@mudela[fragment,verbatim,center]
+  cisis' eisis' gisis' aisis' beses'
+@end mudela
+
+@mudela[fragment,verbatim,center]
+  ceses' eses' geses' ases' beses'
+@end mudela
+
+Whenever a C-sharp is desired,  you must specify a C-sharp.  LilyPond
+will determine what accidentals to typeset depending on the key and
+context.  A reminder accidental 
+@cindex reminder accidental
+ 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{?}
+@cindex ?@@@code{?}
+' after the pitch.
+
+@mudela[fragment,verbatim,center]
+  cis' d' e' cis'  c'? d' e' c'!
+@end mudela
+
+
+@cindex duration
+
+Durations are entered as their reciprocal values.  For notes longer
+than a whole note, use identifiers.
+
+@quotation
+
+@example 
+c'\longa c'\breve  
+c'1 c'2 c'4 c'8 c'16 c'32 c'64 c'64 
+@end example 
+
+@end quotation
+
+@quotation
+
+@mudela[]
+\score {
+  \notes \relative c'' {
+    a\longa a\breve  
+    a1 a2 a4 a8 a16 a32 a64 a64 
+  }
+  \paper {
+    loose_column_distance = 2.5 * \interline;
+    linewidth = -1.0;
+    \translator {
+      \type "Score_engraver";
+      \name "Score";
+      \consists "Note_heads_engraver";
+      \consists "Stem_engraver";
+      \consists "Rhythmic_column_engraver";
+    }
+  }
+}
+@end mudela
+@end quotation
+
+@quotation
+
+@example 
+r\longa r\breve  
+r1 r2 r4 r8 r16 r32 r64 r64 
+@end example 
+
+@end quotation
+
+@quotation
+
+@mudela[]
+\score {
+  \notes \relative c'' {
+    r\longa r\breve  
+    r1 r2 r4 r8 r16 r32 r64 r64 
+  }
+  \paper {
+    loose_column_distance = 2.5 * \interline;
+    linewidth = -1.0;
+    \translator {
+      \type "Score_engraver";
+      \name "Score";
+      \consists "Rest_engraver";
+      \consists "Stem_engraver";
+      \consists "Rhythmic_column_engraver";
+    }
+  }
+}
+@end mudela
+@end quotation
+
+If the duration is omitted then it is set equal to the previous
+duration.  If there is no previous duration, a quarter note is
+assumed.  The duration can be followed by a dot (`@code{.}
+@cindex .@@@code{.}
+')
+to obtain dotted note lengths.
+
+@mudela[fragment,verbatim,center]
+  a'4. b'4.
+@end mudela
+
+You can alter the length of duration by writing
+`@code{*}' after it.  This will not affect the
+appearance of note heads or rests.
+
+
+Rests are entered like notes, with note name `@code{r}
+@cindex r@@@code{r}
+',
+or `@code{R}
+@cindex R@@@code{R}
+'.  There is also a note name `@code{s}
+@cindex s@@@code{s}
+',
+which produces a space of the specified duration. 
+`@code{R}' is specifically meant for entering parts: the @code{R} rest
+can expand to fill a score with rests, or it can be printed as a
+single multimeasure rest.
+
+
+@cindex lyrics expressions
+
+Syllables are entered like notes, with pitches replaced by text.  For
+example, `@code{Twin-4 kle4 twin-4 kle4}' enters four syllables, each
+with quarter note duration.  Note that the hyphen has no special
+meaning for lyrics, and does not introduce special symbols.  See
+section @xref{modes} for a description of what is interpreted as
+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 @xref{lyricprint}.
+
+
+
+@cindex properties
+
+@quotation
+
+  @code{\property}
+@cindex property@@@code{\property}
+
+    @code{.} @code{=} 
+@end quotation
+
+Sets the  property of the context  to
+the specified .  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
+
+@quotation
+
+  @code{\translator}
+@cindex translator@@@code{\translator}
+
+     = 
+@end quotation
+
+A music expression indicating that the context which is a direct
+child of the a context of type  should be shifted to
+a context of type  and the specified name.
+
+Usually this is used to switch staffs in Piano music, e.g.
+
+@quotation
+
+  @code{\translator Staff = top} 
+@end quotation
+
+
+
+@cindex commands
+
+Commands are music expressions that have no duration.   
+
+
+@quotation
+
+  @code{\key}
+@cindex key@@@code{\key}
+   @code{;}
+@end quotation
+
+Change the key signature.   should be
+@code{\major}
+@cindex major@@@code{\major}
+ or @code{\minor}
+@cindex minor@@@code{\minor}
+ to get
+-major or -minor, respectively.  The second
+argument is optional; the default is major keys.  The 
+argument can also be given as an integer, which tells the number of
+semitones that should be added to the pitch given in the subsequent
+@code{\key}
+@cindex key@@@code{\key}
+ commands to get the corresponding major key,
+e.g., @code{\minor}
+@cindex minor@@@code{\minor}
+ is defined as 3.  The standard
+mode names @code{\ionian}
+@cindex ionian@@@code{\ionian}
+,
+@code{\locrian}
+@cindex locrian@@@code{\locrian}
+, @code{\aeolian}
+@cindex aeolian@@@code{\aeolian}
+,
+@code{\mixolydian}
+@cindex mixolydian@@@code{\mixolydian}
+, @code{\lydian}
+@cindex lydian@@@code{\lydian}
+,
+@code{\phrygian}
+@cindex phrygian@@@code{\phrygian}
+, and @code{\dorian}
+@cindex dorian@@@code{\dorian}
+
+are also defined.
+
+@quotation
+
+  @code{\keysignature}
+@cindex keysignature@@@code{\keysignature}
+  @code{;}
+@end quotation
+
+Specify an arbitrary key signature.  The pitches from  will
+be printed in the key signature in the order that they appear on the
+list.
+
+        
+@quotation
+
+  @code{\mark}
+@cindex mark@@@code{\mark}
+  @code{;} @* 
+  @code{\mark}  @code{;}
+@end quotation
+
+Prints a mark over or under (depending on the
+@code{markDirection}
+@cindex markDirection@@@code{markDirection}
+ property) the staff.  You must add
+@code{Mark_engraver}
+@cindex Mark_engraver@@@code{Mark_engraver}
+ to either the Score or Staff context for
+this to work.
+
+@node barlines, manualbeam, notedesc, LilyPond 1-2-0 Reference Manual
+
+@quotation
+
+  @code{\bar}
+@cindex bar@@@code{\bar}
+  @code{;}
+@end quotation
+
+This is a request to print a special bar symbol. It replaces the 
+regular bar symbol with a special
+symbol.  The argument  is a string which specifies the
+kind of bar to print.  Options are @code{":|"}
+@cindex "|A@@@code{:|}
+,
+@code{"|:"}
+@cindex "|B@@@code{|:}
+, @code{":|:"}
+@cindex "|C@@@code{:|:}
+,
+@code{"||"}
+@cindex "|D@@@code{||}
+, @code{"|."}
+@cindex "|E@@@code{|.}
+,
+@code{".|"}
+@cindex "|F@@@code{.|}
+, and @code{".|."}
+@cindex "|G@@@code{.|.}
+. 
+These produce, respectively, a right repeat, a left repeat, a double
+repeat, a double bar, a start bar, an end bar, and a thick double
+bar.  If  is set to @code{"empty"} then nothing is
+printed, but a line break is allowed at that spot.
+
+You are encouraged to use @code{\repeat} for repetitions.
+See section @xref{sec-repeats}.
+
+
+@quotation
+
+  @code{\cadenza}
+@cindex cadenza@@@code{\cadenza}
+  @code{;}
+@end quotation
+
+Music expression that toggles the automatic generation of bar lines. 
+If  is 1, bar line generation is turned off.  If
+ is 0, a bar line is immediately printed and 
+automatic bar generation is turned on.
+
+@quotation
+
+  @code{\time}
+@cindex time@@@code{\time}
+ @code{/} @code{;}
+@end quotation
+
+Change the time signature.  The default time signature is 4/4. 
+The time signature is used to generate bar lines.
+
+@quotation
+
+  @code{\tempo}
+@cindex tempo@@@code{\tempo}
+  =  @code{;}
+@end quotation
+
+Used to specify the tempo.  For example, `@code{\tempo 4 = 76;}'
+requests output with 76 quarter notes per minute.
+
+@quotation
+
+  @code{\partial}
+@cindex partial@@@code{\partial}
+  @code{;}
+@end quotation
+
+@cindex anacrusis
+
+@cindex upstep
+
+This creates an incomplete measure (anacrusis, upbeat) at the start of 
+the music, e.g., `@code{\partial 8*2;}' creates a starting measure 
+lasting two eighth notes.
+
+@quotation
+
+  @code{|}
+@cindex |@@@code{|}
+
+@cindex bar check
+
+@end quotation
+
+@cindex shorten measures
+
+@cindex upstep
+
+`@code{|}' is a barcheck.  Whenever a barcheck is encountered during
+interpretation, a warning message is issued if it doesn't fall at a
+measure boundary.  This can help you finding errors in the input. 
+The beginning of the measure will be relocated, so this can also
+be used to shorten measures.
+
+
+@quotation
+
+  @code{\penalty}
+@cindex penalty@@@code{\penalty}
+  @code{;}
+@end quotation
+
+Discourage or encourage line breaks.  See identifiers
+@code{\break}
+@cindex break@@@code{\break}
+ and @code{\nobreak}
+@cindex nobreak@@@code{\nobreak}
+ in
+section @xref{ident}.
+
+@quotation
+
+  @code{\clef}
+@cindex clef@@@code{\clef}
+  @code{;}
+@end quotation
+
+Music expression that sets the current clef.  The argument is a
+string which specifies the name of the clef.  Several clef names are
+supported.  If `@code{_8}' or `@code{^8}' is added to the end of a clef
+name, then the clef lowered or raised an octave will be generated. 
+Here are the supported clef names with middle C shown in each
+clef:
+
+@quotation
+
+@mudela[]
+\score {
+  \notes {
+    \cadenza 1;
+    %\property Voice.textStyle = typewriter
+    \clef subbass;     c'4-"\kern -5mm subbass" 
+    \clef bass;        c'4^"\kern -2mm bass"
+    \clef baritone;    c'4_"\kern -5mm baritone"
+    \clef varbaritone; c'4^"\kern -6mm varbaritone"
+    \clef tenor;       c'4_"\kern -3mm tenor"
+    \clef "G_8";       c'4^"\kern -2mm G\\_8" 
+  }  
+  \paper {
+    linewidth = 4.5 \in;
+  }
+}
+@end mudela
+@end quotation
+
+@quotation
+
+@mudela[]
+\score {
+  \notes {
+    \cadenza 1;
+    \clef alto;         c'4_"\kern -2mm alto"
+    \clef mezzosoprano; c'4^"\kern -9mm mezzosoprano"
+    \clef soprano;      c'4_"\kern -6mm soprano"
+    \clef treble;       c'4^"\kern -4mm treble"
+    \clef french;       c'4_"\kern -4mm french"
+  }
+  \paper {
+    linewidth = 4.5 \in;
+  }
+}
+@end mudela
+@end quotation
+
+The three clef symbols can also be obtained using the names `@code{G}', 
+`@code{C}' or `@code{F}', optionally followed by an integer which 
+indicates at which note line the clef is located. An as example, the 
+@code{mezzosoprano} clef can also be given as `@code{C2}'.
+
+@quotation
+
+  @code{\skip}
+@cindex skip@@@code{\skip}
+  @code{;}
+@end quotation
+
+Skips the amount of time specified by .  If no other
+music is played, a gap will be left for the skipped time with no
+notes printed.  It works in Note Mode or Lyrics Mode.  In Note mode,
+this has the same effect as the space rest `@code{s}'.
+
+
+@cindex beams
+
+@node manualbeam, tremolo, barlines, LilyPond 1-2-0 Reference Manual
+
+A beam is specified by surrounding the beamed notes with brackets
+`@code{[}
+@cindex [@@@code{[}
+' and `@code{]}
+@cindex ]@@@code{]}
+'.  
+
+@mudela[fragment,verbatim,center]
+  [a'8 a'] [a'16 a' a' a']
+@end mudela
+
+Some more elaborate constructions:
+
+@mudela[fragment,verbatim,center]
+  [a'16 <a' c''> c'' <a' c''>]
+  \times 2/3 { [e'8 f' g'] }
+@end mudela
+
+Beaming can be generated automatically; see section @xref{autobeam}.
+
+To place tremolo marks 
+@cindex tremolo beams
+ between two notes, begin
+with `@code{[:}' and end with `@code{]}'.  Tremolo marks
+will appear instead of beams.  Putting more than two notes in such a
+construction will produce odd effects.  To create tremolo beams on a
+single note, simply attach `@code{:}' to the note itself
+(see also section @xref{tremolo}).
+  
+@mudela[fragment,verbatim,center]
+  [:16 e'1 g'] [:8 e'4 f']
+@end mudela
+  
+@mudela[fragment,verbatim,center]
+  c'4:32 [:16 c'8 d'8]
+@end mudela
+
+
+@cindex --@@@code{-}@code{-}
+
+@cindex __@@@code{__}
+
+@cindex extender
+
+@cindex hyphen
+
+The syntax for an extender mark is `@code{__}'.  This syntax can only
+be used within lyrics mode.  The syntax for a spanning hyphen (i.e.,
+a hyphen that will be printed between two lyric syllables) is
+`@code{-}@code{-}'.
+
+
+@cindex ties
+
+A tie connects two adjacent note heads of the same pitch.  When used
+with chords, it connects all of the note heads whose pitches match.
+Ties are indicated using the tilde symbol `@code{~}
+@cindex ~@@@code{~}
+'.
+If you try to tie together chords which have no common pitches, a
+warning message will appear and no ties will be created.
+
+@mudela[fragment,verbatim,center]
+  e' ~ e' <c' e' g'> ~ <c' e' g'>
+@end mudela
+
+
+
+[TODO: explain Requests]
+
+
+@cindex articulations
+
+@cindex scripts
+
+@cindex ornaments
+
+A variety of symbols can appear above and below notes to indicate
+different characteristics of the performance.  These symbols can be
+added to a note with `@code{-\}'.  Numerous symbols
+are defined in @file{script.ly} and @file{script.scm}.  Symbols can be
+forced to appear above or below the note by writing
+`@code{^\}' and `@code{_\}'
+respectively.  Here is a chart showing symbols above notes, with the
+name of the corresponding symbol appearing underneath.
+
+@mudela[]
+
+  \score {
+    < \notes {
+        c''-\accent      c''-\marcato      c''-\staccatissimo c''-\fermata 
+        c''-\stopped     c''-\staccato     c''-\tenuto        c''-\upbow
+        c''-\downbow     c''^\lheel        c''-\rheel         c''^\ltoe
+        c''-\rtoe        c''-\turn         c''-\open          c''-\flageolet
+        c''-\reverseturn c''-\trill        c''-\prall         c''-\mordent
+        c''-\prallprall  c''-\prallmordent c''-\upprall       c''-\downprall
+        c''-\thumb       c''-\segno        c''-\coda
+      }
+      \context Lyrics \lyrics {  
+        accent__      marcato__      staccatissimo__ fermata
+        stopped__     staccato__     tenuto__        upbow
+        downbow__     lheel__        rheel__         ltoe
+        rtoe__        turn__         open__          flageolet
+        reverseturn__ trill__        prall__         mordent
+        prallprall__  prallmordent__ uprall__        downprall
+        thumb__       segno__        coda
+      }
+    >
+    \paper {
+      linewidth = 5.875\in;          
+      indent    = 0.0;
+    }
+  }
+
+@end mudela
+
+In addition, it is possible to place arbitrary strings of text or
+TeX above or below notes by using a string instead of an
+identifier: `@code{c^"text"}'.  Fingerings 
+@cindex fingering
+ 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.
+
+To save typing, fingering instructions (digits 0 to 9 are
+supported) and single characters shorthands exist for a few
+common symbols
+
+@mudela[]
+
+  \score {
+    \notes {
+      \property Voice.textStyle = typewriter
+      c''4-._"c-."      s4
+      c''4--_"c-{}-"    s4
+      c''4-+_"c-+"      s4
+      c''4-|_"c-|"      s4
+      c''4->_"c->"      s4
+      c''4-^_"c-\\^{ }" s4
+      c''4-1_"c-1"      s4
+      c''4-2_"c-2"      s4
+      c''4-3_"c-3"      s4
+      c''4-4_"c-4"      s4
+    }
+    \paper {
+      linewidth = 5.875 \in;
+      indent    = 0.0;
+    }
+  }
+
+@end mudela
+
+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}
+@cindex ppp@@@code{\ppp}
+,
+@code{\pp}
+@cindex pp@@@code{\pp}
+, @code{\p}
+@cindex p@@@code{\p}
+, @code{\mp}
+@cindex mp@@@code{\mp}
+,
+@code{\mf}
+@cindex mf@@@code{\mf}
+, @code{\f}
+@cindex f@@@code{\f}
+, @code{\ff}
+@cindex ff@@@code{\ff}
+,
+@code{\fff}
+@cindex fff@@@code{\fff}
+, @code{\fff}
+@cindex ffff@@@code{\ffff}
+,
+@code{\fp}
+@cindex fp@@@code{\fp}
+, @code{\sf}
+@cindex sf@@@code{\sf}
+,
+@code{\sff}
+@cindex sff@@@code{\sff}
+, @code{\sp}
+@cindex sp@@@code{\sp}
+,
+@code{\spp}
+@cindex spp@@@code{\spp}
+, @code{\sfz}
+@cindex sfz@@@code{\sfz}
+, and
+@code{\rfz}
+@cindex rfz@@@code{\rfz}
+.
+
+
+@quotation
+
+  @code{\textscript}
+@cindex textscript@@@code{\textscript}
+  
+@end quotation
+
+Defines a text to be printed over or under a note.   is a
+string that may be one of @code{roman}, @code{italic}, @code{typewriter}, 
+@code{bold}, @code{Large}, @code{large}, @code{dynamic} or @code{finger}.
+
+You can attach a general textscript request using this syntax:
+
+@quotation
+
+@example 
+c4-\textscript "6" "finger"
+c4-\textscript "foo" "normal" 
+@end example 
+
+@end quotation
+
+This is equivalent to `@code{c4-6 c4-"foo"}'.  
+
+
+@cindex scripts
+
+@quotation
+
+  @code{\script}
+@cindex script@@@code{\script}
+@end quotation
+
+Prints a symbol above or below a note.  The argument is a string
+which points into the script-alias table defined in @file{script.scm}.
+The scheme definitions specify whether the symbol follows notes into
+the staff, dependence of symbol placement on staff direction, and a
+priority for placing several symbols over one note.  Usually the
+@code{\script}
+@cindex script@@@code{\script}
+ keyword is not used directly.  Various
+helpful identifier definitions appear in @file{script.ly}.
+
+
+@cindex slur
+
+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
+the slur.  The terminal `@code{)}' appears to the left of the
+first note in the slur.  This makes it possible to put a note in
+slurs from both sides:
+
+@mudela[fragment,verbatim,center]
+  f'()g'()a' [a'8 b'(] a'4 g'2 )f'4
+@end mudela
+
+
+@cindex crescendo
+
+A crescendo mark is started with @code{\cr}
+@cindex cr@@@code{\cr}
+ and terminated
+with @code{\rc}
+@cindex rc@@@code{\rc}
+.  A decrescendo mark is started with
+@code{\decr}
+@cindex decr@@@code{\decr}
+ and terminated with
+@code{\rced}
+@cindex rced@@@code{\rced}
+.  There are also shorthands for these
+marks.  A crescendo can be started with @code{\<}
+@cindex <@@@code{\<}
+ and a
+decrescendo can be started with @code{\>}
+@cindex >@@@code{\>}
+.  Either one can
+be terminated with @code{\!}
+@cindex "!@@@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.
+
+@mudela[fragment,verbatim,center]
+  c'' \< \! c''   d'' \decr e'' \rced 
+  < f''1 { s4 \< \! s2 \> \! s4 } >
+@end mudela
+
+
+@quotation
+
+  @code{\spanrequest}
+@cindex spanrequest@@@code{\spanrequest}
+  
+@end quotation
+
+Define a spanning request. The  parameter is either -1
+(@code{\start}
+@cindex start@@@code{\start}
+) or 1 (@code{\stop}
+@cindex stop@@@code{\stop}
+) and
+ 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}.
+
+You can attach a (general) span request to a note using
+
+@mudela[fragment,verbatim,center]
+  c'4-\spanrequest \start "slur"
+  c'4-\spanrequest \stop "slur"
+@end mudela
+
+The slur syntax with parentheses is a shorthand for this.
+
+
+
+@cindex tremolo marks
+
+@node tremolo, Compound music expressions, manualbeam, LilyPond 1-2-0 Reference Manual
+
+Tremolo marks can be printed on a single note by adding
+`@code{:}[]' after the note.  The length must be at
+least 8.  A  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{abbrev}
+@cindex abbrev@@@code{abbrev}
+ property if there was
+no last value.
+
+@mudela[verbatim,fragment,center]
+  c'2:8 c':32
+@end mudela
+
+
+
+@node Compound music expressions, compoundmusic, tremolo, LilyPond 1-2-0 Reference Manual
+@section Compound music expressions
+
+@cindex compound music expressions
+
+@node compoundmusic, relative, Compound music expressions, LilyPond 1-2-0 Reference Manual
+
+Music expressions are compound data structures.  You can nest music
+expressions any way you like.  This simple example shows how three
+chords can be expressed in two different ways:
+
+@mudela[fragment,verbatim,center]
+  \notes \context Staff {
+    \cadenza 1;
+    <a c'> <b  d' > <c' e' >
+    <{a b  c'}{c' d' e'}>
+  }
+@end mudela
+
+
+
+@cindex context selection
+
+@quotation
+
+  @code{\context}
+@cindex context@@@code{\context}
+
+     [@code{=} ] 
+@end quotation
+
+Interpret  within a context of type . 
+If the context does not exist, it will be created.  The new context
+can optionally be given a name.  See
+section @xref{contextselection} and @xref{contextdefs} for more
+information on interpretation contexts.
+
+
+
+@cindex input modes
+
+@cindex mode switch
+
+Mode switching keywords form compound music expressions: @code{\notes}
+
+@cindex notes@@@code{\notes}
+ , @code{\chords} 
+@cindex chords@@@code{\chords}
+
+, and @code{\lyrics} 
+@cindex lyrics@@@code{\lyrics}
+ . 
+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 section @xref{modes} for more
+information on modes.
+
+More information on context selection can be found in
+section @xref{contextselection}.
+
+
+
+@cindex sequential music
+
+
+
+@quotation
+
+  @code{\sequential}
+@cindex sequential@@@code{\sequential}
+
+    @code{@{}  @code{@}}
+@end quotation
+
+This means that list should be played or written in sequence, i.e.,
+the second after the first, the third after the second.  The duration
+of sequential music is the the sum of the durations of the elements. 
+There is a shorthand, which leaves out the keyword:
+
+@quotation
+
+  @code{@{}  @code{@}}
+@end quotation
+
+
+
+@cindex simultaneous music
+
+@cindex <@@@code{<}
+
+@cindex >@@@code{>}
+
+@quotation
+
+  @code{\simultaneous}
+@cindex simultaneous@@@code{\simultaneous}
+
+    @code{@{}  @code{@}}
+@end quotation
+
+It constructs a music expression where all of its arguments start at
+the same moment.  The duration is the maximum of the durations of the
+elements.  The following shorthand is a common idiom:
+
+@quotation
+
+  @code{<}  @code{>}
+@end quotation
+
+If you try to use a chord as the first thing in your score, you might
+get multiple staffs instead of a chord.
+
+@mudela[verbatim,center]
+  \score {
+    \notes <c''4 e''>
+    \paper {
+      linewidth = -1.;
+    }
+  }
+@end mudela
+
+This happens because the chord is interpreted by a score context.
+Each time a note is encountered a default Voice context (along with a
+Staff context) is created.  The solution is to explicitly instantiate
+a Voice context:
+
+@mudela[verbatim,center]
+  \score {
+    \notes\context Voice <c''4 e''>
+    \paper {
+      linewidth = -1.;
+    }
+  }
+@end mudela
+
+
+
+@cindex relative pitch specification
+
+@node relative, sec-repeats, compoundmusic, LilyPond 1-2-0 Reference Manual
+
+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.
+
+@quotation
+
+  @code{\relative}
+@cindex relative@@@code{\relative}
+  
+@end quotation
+
+The octave of notes that appear in  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
+.
+
+Entering scales is straightforward in relative mode.
+
+@mudela[fragment,verbatim,center]
+  \relative c' {
+    c d e f g a b c c,
+  }
+@end mudela
+
+And octave changing marks are used for intervals greater than a fourth.
+
+@mudela[fragment,verbatim,center]
+  \relative c'' {
+    c g c f, c' a, e'' }
+@end mudela
+
+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.
+
+@mudela[fragment,verbatim,center]
+  \relative c' {
+    c <c e g> 
+    <c' e g>
+    <c, e' g>
+  }
+@end mudela 
+
+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}
+@cindex notes@@@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.
+
+
+
+Chord names are a way to generate simultaneous music expressions that
+correspond with traditional chord names.  It can only be used in
+Chord mode (see section @xref{modes}).
+
+@quotation
+
+  [][@code{-}][@code{^}][@code{/}].
+@end quotation
+
+ should be the tonic note of the chord, and 
+is the chord duration in the usual notation.  There are two kinds of
+modifiers.  One type is @emph{chord additions}, which are obtained by
+listing intervals separated by dots.  An interval is written by its
+number with an optional `@code{+}' or `@code{-}' to indicate raising or
+lowering by half a step.  Chord additions has two effects: It adds
+the specified interval and all lower odd numbered intervals to the
+chord, and it may lower or raise the specified interval.  Intervals
+must be separated by a dot (`@code{.}').
+
+@quotation
+
+@mudela[fragment,verbatim]
+\transpose c'' {
+  \chords {
+    c1  c-3-       c-7     c-8
+    c-9 c-9-.5+.7+ c-3-.5- c-4.6.8
+  }
+}
+
+@end mudela
+@end quotation
+
+The second type of modifier that may appear after the `@code{-}' is a
+named modifier.  Named modifiers are listed in the file
+@file{chord-modifiers.ly}.  The available modifiers are `@code{m}' and
+`@code{min}' which lower the 3rd half a step, `@code{aug}
+@cindex aug@@@code{aug}
+' which
+raises the 5th, `@code{dim}
+@cindex dim@@@code{dim}
+' which lowers the 5th,
+`@code{maj}
+@cindex maj@@@code{maj}
+' which adds a raised 7th, and `@code{sus}
+@cindex sus@@@code{sus}
+'
+which replaces the 5th with a 4th.
+
+@quotation
+
+@mudela[fragment,verbatim]
+\transpose c'' {
+  \chords {
+    c1-m c-min7 c-maj c-aug c-dim c-sus
+  }
+}
+
+@end mudela
+@end quotation
+
+Chord subtractions are used to eliminate notes from a chord.  The
+notes to be subtracted are listed after a `@code{^}' character,
+separated by dots.
+
+@mudela[fragment,verbatim,center]
+  \transpose c'' {
+    \chords {
+      c1^3 c-7^5.3 c-8^7
+    }
+  }
+@end mudela 
+
+Chord inversions can be specified by appending `@code{/}
+@cindex /@@@code{/}
+' and
+the name of a single note to a chord.  This has the effect of
+lowering the specified note by an octave so it becomes the lowest
+note in the chord.  If the specified note is not in the chord, a
+warning will be printed.
+
+@mudela[fragment,verbatim,center]
+  \transpose c''' {
+    \chords {
+      c1 c/e c/g c-7/e
+    }
+  }
+
+@end mudela 
+
+Throughout these examples, chords have been shifted around the staff
+using @code{\transpose}.
+
+You should not combine @code{\relative} with named chords. 
+
+
+
+@cindex tuplets
+
+Tuplets are made out of a music expression by multiplying their
+duration with a fraction.
+
+@quotation
+
+  @code{\times}
+@cindex times@@@code{\times}
+  
+@end quotation
+
+The duration of  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:
+
+@mudela[fragment,verbatim,center]
+  g'4 \times 2/3 {c'4 c' c'} d'4 d'4
+@end mudela
+
+
+
+@cindex grace notes
+
+@quotation
+
+  @code{\grace}
+@cindex grace@@@code{\grace}
+@end quotation
+
+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 graceAlignPosition@@@code{graceAlignPosition}
+.
+
+When grace music is interpreted, a score-within-a-score is set up:
+ 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{stemStyle}
+@cindex stemStyle@@@code{stemStyle}
+ property.
+
+@quotation
+
+@mudela[fragment,verbatim]
+\relative c'' {
+  \grace c8 c4 \grace { [c16 c16] } c4
+  \grace { \property Grace.stemStyle = "" c16 } c4
+}
+
+@end mudela
+@end quotation
+
+At present, nesting @code{\grace}
+@cindex grace@@@code{\grace}
+ notes, e.g.
+
+@quotation
+
+  @code{\grace @{ \grace c32 c16 @} c4}
+@end quotation
+
+may result in run-time errors of LilyPond.  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.
+
+
+
+@cindex repeats
+
+@node sec-repeats, transpose, relative, LilyPond 1-2-0 Reference Manual
+
+In order to specify repeats, use the @code{\repeat}
+@cindex repeat@@@code{\repeat}
+
+keyword.  Since repeats look and sound differently when played or
+printed, there are a few different variants of repeats.
+
+@table @samp
+  @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 useful for
+    lyrics.
+@end table  
+
+The syntax for repeats is
+
+@quotation
+
+  @code{\repeat}   
+@end quotation
+
+If you have alternative endings, you may add
+
+@quotation
+
+  @code{\alternative}
+@cindex alternative@@@code{\alternative}
+
+    @code{@{} 
+            
+             ... @code{@}}
+@end quotation
+
+where each  is a Music expression.
+
+Normal notation repeats are used like this:
+
+@quotation
+
+@mudela[fragment,verbatim]
+  c'1
+  \repeat volta 2 { c'4 d' e' f' }
+  \repeat volta 2 { f' e' d' c' }
+
+@end mudela
+@end quotation
+
+With alternative endings:
+
+@quotation
+
+@mudela[fragment,verbatim]
+  c'1
+  \repeat volta 2 {c'4 d' e' f'} 
+  \alternative { {d'2 d'} {f' f} }
+
+@end mudela
+@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.}
+
+@quotation
+
+@mudela[fragment,verbatim]
+  c'1
+  \repeat fold 2 {c'4 d' e' f'} 
+  \alternative { {d'2 d'} {f' f} }
+
+@end mudela
+@end quotation
+
+@quotation
+
+@mudela[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 mudela
+@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
+
+@mudela[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 } }
+  }
+}
+
+@end mudela
+@end quotation
+
+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.
+
+
+
+@cindex transposition of pitches
+
+@node transpose, Ambiguities, sec-repeats, LilyPond 1-2-0 Reference Manual
+
+A music expression can be transposed with
+@code{\transpose}
+@cindex transpose@@@code{\transpose}
+.  The syntax is
+
+@quotation
+
+  @code{\transpose}  
+@end quotation
+
+This means that middle C in  is transposed to
+.
+
+@code{\transpose} distinguishes between enharmonic pitches: both
+@code{\transpose cis'} or @code{\transpose des'} will transpose up half
+a tone.  The first version will print sharps and the second version
+will print flats.
+
+@quotation
+
+@mudela[fragment,verbatim]
+\context Staff {
+  \clef "F";
+  { \key e; c d e f }
+  \clef "G";
+  \transpose des'' { \key e; c d e f }
+  \transpose cis'' { \key e; c d e f }
+}
+
+@end mudela
+@end quotation
+
+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}.
+
+
+
+@cindex automatic lyric durations
+
+If you have lyrics that are set to a melody, you can import the
+rhythm of that melody into the lyrics using @code{\addlyrics}.
+
+@cindex addlyrics@@@code{\addlyrics}
+ The syntax for this is
+
+@quotation
+
+  @code{\addlyrics} 
+@end quotation
+
+This means that both  and  are
+interpreted, but that every non-command atomic music expression
+(``every syllable'') in  is interpreted using timing
+of .
+
+If the property @code{automaticMelismata}
+@cindex automaticMelismata@@@code{automaticMelismata}
+ is set in the
+context of , no lyrics will be put on slurred or tied
+notes.
+
+@quotation
+
+@mudela[verbatim,fragment]
+\addlyrics
+\transpose c'' {
+  \property Voice.automaticMelismata = "1"
+  c8 () cis d8. e16 f2
+}
+\context Lyrics \lyrics {
+ do4 re mi fa }
+
+@end mudela
+@end quotation
+
+You should use a single rhythm melody, and single rhythm lyrics (a
+constant duration is the obvious choice).  If you do not, you will get
+undesired effects when using multiple stanzas:
+
+@quotation
+
+@mudela[verbatim,fragment]
+\addlyrics
+\transpose c'' {
+  c8 () cis d8. e16 f2
+}
+\context Lyrics \lyrics
+< { do4 re mi fa }
+  { do8 re mi fa } >
+
+@end mudela
+@end quotation
+
+It is valid (but probably not very useful) to use notes instead of
+lyrics for .
+
+
+
+
+@node Ambiguities, Notation conversion specifics, transpose, LilyPond 1-2-0 Reference Manual
+@section Ambiguities
+
+@cindex ambiguities
+
+The grammar contains a number of ambiguities.@footnote{The authors
+hope to resolve them at a later time.}
+
+@itemize @bullet
+  @item  The assignment
+
+       @quotation
+
+         @example 
+foo = bar 
+@end example 
+
+       @end quotation
+
+       can be interpreted as making a string identifier @code{\foo}
+       containing @code{"bar"}, or a music identifier @code{\foo}
+       containing the syllable `bar'.
+
+  @item  The assignment
+
+       @quotation
+
+         @example 
+foo = -6 
+@end example 
+
+       @end quotation
+
+       can be interpreted as making an integer identifier
+       containing -6, or a Request identifier containing the
+       fingering `6' (with neutral direction).
+
+  @item  If you do a nested repeat like
+
+       @quotation
+
+@example 
+\repeat ...
+\repeat ...
+\alternative 
+@end example 
+
+       @end quotation
+
+       then it is ambiguous to which @code{\repeat} the
+       @code{\alternative} belongs.  This is the classic if-then-else
+       dilemma.  It may be solved by using braces.
+
+  @item  (an as yet unidentified ambiguity :-)
+@end itemize
+
+
+
+@node Notation conversion specifics, autobeam, Ambiguities, LilyPond 1-2-0 Reference Manual
+@section Notation conversion specifics
+
+
+
+@cindex automatic beam generation
+
+@node autobeam, lyricprint, Notation conversion specifics, LilyPond 1-2-0 Reference Manual
+
+By default, LilyPond will generate beams automatically.  This feature
+can be disabled by setting the @code{Voice.noAutoBeaming}
+@cindex Voice.noAutoBeaming@@@code{Voice.noAutoBeaming}
+
+property to 1.  It can be overridden for specific cases by
+specifying explicit beams as described in
+section @xref{manualbeam}.
+
+A large number of Voice properties are used to decide how to generate
+beams.  Their default values appear in @file{auto-beam-settings.ly}.
+In general, beams can begin anywhere, but their ending location is
+significant.  Beams can end on a beat, or at durations specified by
+the @code{Voice.beamAutoEnd}
+@cindex Voice.beamAutoEnd@@@code{Voice.beamAutoEnd}
+ property.  To end beams every
+quarter note, for example, you could set
+@code{Voice.beamAutoEnd}
+@cindex Voice.beamAutoEnd@@@code{Voice.beamAutoEnd}
+ equal to `@code{"1/4"}'.  To end beams
+at every three eighth notes you would set it to `@code{"3/8"}'.  The
+same syntax can be used to specify beam starting points using
+@code{Voice.beamAutoBegin}
+@cindex Voice.beamAutoBegin@@@code{Voice.beamAutoBegin}
+.
+
+To allow different settings for different time signatures, these
+property names can start with `@code{time}@code{_}' to
+restrict the definition to `@code{/}' time.  For example,
+to specify beams ending only for 6/8 time you would use the
+property @code{Voice.time6_8beamAutoEnd}.  To allow different endings
+for notes of different durations, the duration can be tacked onto the
+end of the property.  To specify beam endings for beams that contain
+32nd notes, you would use @code{Voice.beamAutoEnd_32}.
+
+
+
+@cindex chord names
+
+@cindex chords
+
+@cindex printing!chord names
+
+For displaying printed chord names, use the @code{ChordNames}
+@cindex ChordNames@@@code{ChordNames}
+
+and @code{ChordNameVoice}
+@cindex ChordNameVoice@@@code{ChordNameVoice}
+ contexts.  The chords may be entered
+either using the notation described above, or directly using
+simultaneous music.
+
+@quotation
+
+@mudela[fragment,verbatim]
+<
+  \context ChordNames {
+    \chords{a b c} \notes{<d f g>  <e g b>}
+  }
+  \context Staff \notes {
+    a b c' d' e'
+  }
+>
+
+@end mudela
+@end quotation
+
+LilyPond examines chords specified as lists of notes to determine a
+name to give the chord.  By default, LilyPond will not try to
+identify chord inversions:
+
+@mudela[fragment,verbatim,center]
+  <
+    \context ChordNameVoice \notes {
+      <e'1 g' c''>
+    }
+    \context Thread \notes {
+      <e'1 g' c''>
+    }
+  >
+@end mudela
+
+If you want inversions to be recognized, you must set the property
+@code{ChordNames.chordInversion}
+@cindex ChordNames.chordInversion@@@code{ChordNames.chordInversion}
+:
+
+@mudela[fragment,verbatim,center]
+  <
+    \property Score.chordInversion = 1
+    \context ChordNameVoice \notes {
+      <e'1 g' c''>
+    }
+    \context Thread \notes {
+      <e'1 g' c''>
+    }
+  >
+@end mudela
+
+
+
+@cindex lyrics
+
+@cindex printing!lyrics
+
+@node lyricprint, Notation Contexts, autobeam, LilyPond 1-2-0 Reference Manual
+
+Lyric syllables must be interpreted within a @code{Lyrics} context
+
+@cindex context!Lyrics
+ for printing them.
+
+Here is a full example: 
+
+@quotation
+
+@mudela[verbatim]
+\score {
+  <
+    \notes \transpose c'' {
+      c d e c | c d e c |
+      e f g2 | e4 f g2 \bar "|.";
+    }
+    \context Lyrics \lyrics { 
+      Va-4 der Ja- cob Va- der Ja- cob
+      Slaapt gij nog?2 Slaapt4 gij nog?2
+    }
+  >
+}
+
+@end mudela
+@end quotation
+
+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
+that extends over the entire duration of the lyric.  This line will
+run all the way to the start of the next lyric, so you may want to
+shorten it by using a blank lyric (using `@code{_}').
+
+@quotation
+
+@mudela[verbatim]
+\score {
+  <
+    \notes \relative c'' {
+      a4 () b () c () d | c () d () b () a | c () d () b () a
+    }
+    \context Lyrics \lyrics {
+      foo1 __ | bar2. __ _4 | baz1 __
+    }
+  >
+}
+
+@end mudela
+@end quotation
+
+     
+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
+will result in a hyphen which length varies depending on the space
+between syllables, and which will be centered between the syllables. 
+For example:
+
+@quotation
+
+@mudela[verbatim]
+\score {
+  <
+    \notes \transpose c'' {
+      c d e c | c d e c |
+      e f g2 | e4 f g2 \bar "|.";
+    }
+    \context Lyrics \lyrics {
+      Va4 -- der Ja -- cob | Va -- der Ja -- cob |
+      Slaapt gij nog?2 | Slaapt4 gij nog?2
+    }
+  >
+}
+
+@end mudela
+@end quotation
+
+
+
+@node Notation Contexts, contextselection, lyricprint, LilyPond 1-2-0 Reference Manual
+@section Notation Contexts
+
+@cindex notation contexts
+
+Notation contexts are objects that only exist during a run of
+LilyPond.  During the interpretation phase of LilyPond, the Music
+expression contained in a @code{\score} block is interpreted in time
+order.  This is the order in which humans read, play, and write
+music.
+
+A context is an object that holds the reading state of the
+expression; it contains information like
+
+@itemize @bullet
+  @item  What notes are playing at this point?
+  @item  What symbols will be printed at this point?
+  @item  In what style will they printed?
+  @item  What is the current key signature, time signature, point within
+       the measure, etc.?
+@end itemize
+
+Contexts are grouped hierarchically: A @code{Voice} context is
+contained in a @code{Staff} context (because a staff can contain
+multiple voices at any point), a @code{Staff} context is contained in
+a @code{Score}, @code{StaffGroup}, or @code{ChoirStaff} context (because
+these can all contain multiple staffs).
+
+Contexts associated with sheet music output are called @emph{notation
+contexts}, those for sound output are called playing contexts.
+
+Contexts are created either manually or automatically.  Initially,
+the top level music expression is interpreted by the top level
+context (the @code{Score} context).  When a atomic music expression
+(i.e. a note, a rest, @code{\bar}, or @code{\time} commands), a nested
+set of contexts is created that can process these atomic expressions,
+as in this example:
+
+@quotation
+
+  @example 
+\score @{ \notes < c4 > @} 
+@end example 
+
+@end quotation
+
+The sequential music, `@code{@{ c4 @}}' is interpreted by @code{Score}
+context. When the note `@code{c4}' itself is interpreted, a set of
+contexts is needed that will accept notes.  The default for this is a
+@code{Voice} context, contained in a @code{Staff} context.  Creation of
+these contexts results in the staff being printed.
+
+
+@node contextselection, Notation output definitions, Notation Contexts, LilyPond 1-2-0 Reference Manual
+
+@cindex context
+
+You can also create contexts manually, and you probably have to do so
+if you want to typeset complicated multiple part material.  If a
+`@code{\context}  ' expression is encountered
+during the interpretation phase, the  argument will be
+interpreted with a context of type .  If you specify a name,
+the specific context with that name is searched.
+
+If a context of the specified type and name can not be found, a new
+one is created.  For example,
+
+@quotation
+
+@mudela[verbatim]
+\score {
+  \notes \relative c'' {
+    c4 <d4 \context Staff = "another" e4> f
+  }
+}
+
+@end mudela
+@end quotation
+
+In this example, the @code{c} and @code{d} are printed on the
+default staff.  For the @code{e}, a context Staff called
+`@code{another}' is specified; since that does not exist, a new
+context is created.  Within @code{another}, a (default) Voice context
+is created for the @code{e4}.  When all music referring to a
+context is finished, the context is ended as well.  So after the
+third quarter, @code{another} is removed.
+
+Almost all music expressions inherit their interpretation context
+from their parent.  In other words, suppose that the syntax for a
+music expression is
+
+@quotation
+
+  @code{\keyword}   ...
+@end quotation
+
+When the interpretation of this music expression starts, the context
+for , , etc. is that of the total
+expression.
+
+Lastly, you may wonder, why this:
+
+@quotation
+
+@example 
+\score @{
+  \notes \relative c'' @{
+    c4 d4 e4
+  @}
+@} 
+@end example 
+
+@end quotation
+
+doesn't result in this:
+
+@mudela[]
+
+  \score {
+    \notes \relative c'' {
+      <c4> <d4> <e4>
+    }
+  }
+
+@end mudela
+
+For the @code{c4}, a default @code{Staff} (with a contained
+@code{Voice}) context is created.  After the @code{c4} ends, no
+music refers to this default staff, so it would be ended, with the
+result shown.  To prevent this inconvenient behavior, the context to
+which the sequential music refers is adjusted during the
+interpretation.  So after the @code{c4} ends, the context of the
+sequential music is also the default @code{Voice} context. 
+The @code{d4} gets interpreted in the same context
+as @code{c4}.
+
+
+
+These are the contexts supplied with the package.  They are defined
+in the initialization file @file{ly/engraver.ly}.
+
+@table @samp
+  @item @code{Grace}
+@cindex Grace@@@code{Grace}
+ @* 
+    The context for handling grace notes.  It is instantiated
+    automatically when you use @code{\grace}.  Basically, it is an
+    `embedded' miniature of the Score context.  Since this context
+    needs special interaction with the rest of LilyPond, you should
+    not explicitly instantiate it.
+
+  @item @code{LyricVoice}
+@cindex LyricVoice@@@code{LyricVoice}
+ @* 
+    Corresponds to a voice with lyrics.  Handles the printing of a
+    single line of lyrics.
+
+  @item @code{Thread}
+@cindex Thread@@@code{Thread}
+ @* 
+    Handles note heads, and is contained in the Voice context.  You
+    have to instantiate this explicitly if you want to adjust the
+    style of individual note heads.
+
+  @item @code{Voice}
+@cindex Voice@@@code{Voice}
+ @* 
+    Corresponds to a voice on a staff.  This context handles the
+    conversion of dynamic signs, stems, beams, super- and subscripts,
+    slurs, ties, and rests.
+
+    You have to instantiate this explicitly if you want to have
+    multiple voices on the same staff.
+
+  @item @code{ChordNamesVoice}
+@cindex ChordNamesVoice@@@code{ChordNamesVoice}
+ @* 
+    A voice with chord names.  Handles printing of a line of chord
+    names.
+
+  @item @code{ChordNames}
+@cindex ChordNames@@@code{ChordNames}
+ @* 
+    Typesets chord names.  Can contain @code{ChordNamesVoice}
+    contexts.
+
+  @item @code{Lyrics}
+@cindex Lyrics@@@code{Lyrics}
+ @* 
+    Typesets lyrics.  It can contain @code{LyricVoice} contexts.
+
+  @item @code{Staff}
+@cindex Staff@@@code{Staff}
+ @* 
+    Handles clefs, bar lines, keys, accidentals.  It can contain
+    @code{Voice} contexts.
+
+  @item @code{RhythmicStaff}
+@cindex RhythmicStaff@@@code{RhythmicStaff}
+ @* 
+    A context like @code{Staff} but for printing rhythms.  Pitches are
+    ignored; the notes are printed on one line.  It can contain
+    @code{Voice} contexts.
+
+  @item @code{GrandStaff}
+@cindex GrandStaff@@@code{GrandStaff}
+ @* 
+    Contains @code{Staff} or @code{RhythmicStaff} contexts.  It adds a
+    brace on the left side, grouping the staffs together.  The bar
+    lines of the contained staffs are connected vertically.  It can
+    contain @code{Staff} contexts.
+
+  @item @code{PianoStaff}
+@cindex PianoStaff@@@code{PianoStaff}
+ @* 
+    Just like @code{GrandStaff} but with @code{minVerticalAlign} set
+    equal to @code{maxVerticalAlign} so that interstaff beaming and
+    slurring can be used.
+
+  @item @code{StaffGroup}
+@cindex StaffGroup@@@code{StaffGroup}
+ @* 
+    Contains @code{Staff} or @code{RhythmicStaff} contexts.  Adds a
+    bracket on the left side, grouping the staffs together.  The bar
+    lines of the contained staffs are connected vertically.  It can
+    contain @code{Staff}, @code{RhythmicStaff}, @code{GrandStaff}, or
+    @code{Lyrics} contexts.
+
+  @item @code{ChoirStaff}
+@cindex ChoirStaff@@@code{ChoirStaff}
+ @* 
+    Identical to @code{StaffGroup} except that the contained staffs
+    are not connected vertically.
+
+  @item @code{Score}
+@cindex Score@@@code{Score}
+ @* 
+    This is the top level notation context.  No other context can
+    contain a @code{Score} context.  This context handles the
+    administration of time signatures.  It also makes sure that items
+    such as clefs, time signatures, and key-signatures are aligned
+    across staffs.  It can contain @code{Lyrics}, @code{Staff},
+    @code{RhythmicStaff}, @code{GrandStaff}, @code{StaffGroup}, and
+    @code{ChoirStaff} contexts.
+
+    You cannot explicitly instantiate a Score context (since it is
+    not contained in any other context).  It is instantiated
+    automatically when an output definition (a @code{\score} or
+    @code{\paper} block) is processed.
+@end table
+
+
+
+Properties that are set in one context are inherited by all of the
+contained contexts.  This means that a property valid for the
+@code{Voice} context can be set in the @code{Score} context (for
+example) and thus take effect in all @code{Voice} contexts.
+
+Properties can be preset within the @code{\translator} block
+corresponding to the appropriate context.  In this case, the syntax
+is
+
+@quotation
+
+   @code{=} 
+@end quotation
+
+This assignment happens before interpretation starts, so a
+@code{\property} expression will override any predefined settings.
+
+The @code{\property} expression will create any property you specify.
+There is no guarantee that a property will be used.  So if you spell
+a property name wrong, there will be no error message.
+
+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
+notation are called @emph{engravers}, and translators for sound are
+called @emph{performers}.
+
+The precise result of a property is determined by the implementation
+of the translator that reads them.  Therefore, the result of a
+property can vary, since it is implementation and configuration
+dependent.
+
+In order to fully find out what properties are used, you must
+currently search the source code for calls to @code{get_property}. 
+The rest of the section is devoted to an (incomplete) overview of
+available properties.
+
+
+@cindex properties!Lyrics
+
+@table @samp
+  @item @code{textStyle}
+@cindex textStyle@@@code{textStyle}
+ @* 
+    Set the font for lyrics.  The available font choices are
+    @code{roman}, @code{italic}, @code{bold}, @code{large}, @code{Large},
+    @code{typewriter}, and @code{finger}.  The @code{finger} font can
+    only display numbers.  Note also that you must be careful when
+    using @code{\property} in Lyrics mode, because of the way strings
+    are parsed.  Either put quotes around the arguments to
+    @code{\property} or be sure to leave a space on both sides of the
+    dot.
+@end table
+
+
+@cindex properties!Thread
+
+@table @samp
+  @item @code{noteheadStyle}
+@cindex noteheadStyle@@@code{noteheadStyle}
+ @* 
+    Selects type of note head.  Choices are @code{cross},
+    @code{diamond}, @code{harmonic}, @code{transparent}, and @code{""}. 
+    They are shown in that order below.
+
+    @mudela[center]
+
+      \score {
+        \notes { 
+          \property Staff.barNonAuto = 1
+          \property Voice.noteHeadStyle = cross 
+          a'
+          \property Voice.noteHeadStyle = diamond
+          a'
+          \property Voice.noteHeadStyle = harmonic
+          a'
+          \property Voice.noteHeadStyle = transparent
+          a' 
+          \property Voice.noteHeadStyle = ""
+          a'
+        }
+        \paper {
+          linewidth = -1.;
+        }
+      }
+    
+@end mudela
+@end table
+
+@subsubheading Grace properties
+
+@cindex properties!Grace
+
+@table @samp  
+  @item @code{stemStyle}
+@cindex stemStyle@@@code{stemStyle}
+ @* 
+    By default set to @code{"grace"} meaning that all unbeamed 
+    notes with flags are typeset with a slash through the flag. 
+    Setting to @code{""} gives standard flags.
+@end table
+
+
+@cindex properties!Voice
+
+@table @samp  
+  @item @code{abbrev}
+@cindex abbrev@@@code{abbrev}
+ @* 
+    Set length for tremolo to be used if no length is explicitly
+    specified. 
+
+  @item @code{articulationScriptPadding}
+@cindex articulationScriptPadding@@@code{articulationScriptPadding}
+
+    @* 
+    Determines the extra space added between articulation marks, such
+    as staccato, tenuto, trill, up/down bow or fermata, and the
+    closest staff line or note.
+
+  @item @code{articulationScriptVerticalDirection}
+    
+@cindex articulationScriptVerticalDirection@@@code{articulationScriptVerticalDirection}
+ @* 
+    Determines the location of articulation marks.  Set to @code{\up}
+    to print marks above the staff; set to @code{\down} to print marks
+    below the staff.  This property does not override explicit
+    directions marked with `@code{^}' or `@code{_}' in the mudela file.
+    
+  @item @code{noAutoBeaming}
+@cindex beamAuto@@@code{beamAuto}
+ @* 
+    If set to 1 then beams are not generated automatically.
+
+  @item @code{beamAutoEnd}
+@cindex beamAutoEnd@@@code{beamAutoEnd}
+ @* 
+    Specifies when automatically generated beams can end.  See
+    section @xref{autobeam}.
+
+  @item @code{beamAutoBegin}
+@cindex beamAutoBegin@@@code{beamAutoBegin}
+ @* 
+    Specifies when automatically generated beams can start.  See
+    section @xref{autobeam}.
+
+  @item @code{beamquantisation}
+@cindex beamquantisation@@@code{beamquantisation}
+ @* 
+    Set to @code{\none} for no quantization.  Set to @code{\normal} to
+    quantize position and slope.  Set to @code{\traditional} to avoid
+    wedges.  These three settings are available via
+    @code{\beamposfree}
+@cindex beamposfree@@@code{\beamposfree}
+,
+    @code{\beamposnormal}
+@cindex beamposnormal@@@code{\beamposnormal}
+, and
+    @code{\beampostraditional}
+@cindex beampostraditional@@@code{\beampostraditional}
+.
+
+  @item @code{beamslopedamping}
+@cindex beamslopedamping@@@code{beamslopedamping}
+ @* 
+    Set to @code{\none} for undamped beams.  Set to @code{\normal} for
+    damped beams.  Set to @code{\infinity} for beams with zero slope. 
+    The identifiers
+    @code{\beamslopeproportional}
+@cindex beamslopeproportional@@@code{\beamslopeproportional}
+,
+    @code{\beamslopedamped}
+@cindex beamslopedamped@@@code{\beamslopedamped}
+, and
+    @code{\beamslopezero}
+@cindex beamslopezero@@@code{\beamslopezero}
+ each set the
+    corresponding value.
+
+  @item @code{dynamicDirection}
+@cindex dynamicDirection@@@code{dynamicDirection}
+ @* 
+    Determines location of dynamic marks.  Set to @code{\up} to print
+    marks above the staff; set to @code{\down} to print marks below
+    the staff.
+
+  @item @code{dynamicStyle}
+@cindex dynamicStyle@@@code{dynamicStyle}
+ @* 
+    Set the text style for dynamics.  
+
+  @item @code{fontSize}
+@cindex fontSize@@@code{fontSize}
+ @* 
+    Can be used to select smaller font sizes for music.  The normal
+    font size is 0, and the two smaller sizes are -1
+    and -2.
+
+   @item @code{forceHorizontalShift}
+@cindex forceHorizontalShift@@@code{forceHorizontalShift}
+ @* 
+    Force horizontal shift for collision resolution.  It overrides
+    automatic collision resolution.  The value is the shift amount
+    expressed in @code{note_width}, as set in the paper section.
+    
+
+  @item @code{horizontalNoteShift}
+@cindex horizontalNoteShift@@@code{horizontalNoteShift}
+ @* 
+    Enable LilyPond to shift notes horizontally if they collide with
+    other notes.  This is useful when typesetting many voices on one
+    staff.  The identifier @code{\shift}
+@cindex shift@@@code{\shift}
+ is defined to
+    enable this.  Traditionally, the outer chords (the upmost and
+    downmost voices), should have no @code{horizontalNoteShift}.
+
+  @item @code{markScriptPadding}
+@cindex markScriptPadding@@@code{markScriptPadding}
+ @* 
+    Determines the extra space added between the mark and the closest
+    staff line or note.
+
+  @item @code{markDirection}
+@cindex markDirection@@@code{markDirection}
+ @* 
+    Determines if marks should be printed above or below the staff.
+    Set to @code{\up} to print marks above the staff; set to
+    @code{\down} to print marks below the staff.
+
+  @item @code{midiInstrument}
+@cindex midiInstrument@@@code{midiInstrument}
+ @* 
+    Sets the instrument for MIDI output.  If this property is not set
+    then LilyPond will use the @code{instrument} property.  This must
+    be set to one of the strings on the list of MIDI instruments that
+    appears in section @xref{midilist}.  If you use a string which
+    is not listed, LilyPond will silently substitute piano.
+
+  @item @code{oldTieBehavior}
+@cindex oldTieBehavior@@@code{oldTieBehavior}
+ @* 
+    Set to 1 in order to get old tie behavior where ties would
+    connect unequal pitches.  This property is deprecated, and its
+    use is not recommended.
+
+  @item @code{restStyle}
+@cindex restStyle@@@code{restStyle}
+ @* 
+    Change the layout of rests shorter than quarter notes. 
+    Currently, the standard layout @code{""} and mensural notation
+    @code{"mensural"} are available. Mensural rests of duration
+    32 or shorter are not available.
+    
+  @item @code{scriptHorizontal}
+@cindex scriptHorizontal@@@code{scriptHorizontal}
+ @* 
+    Put scripts left or right of note heads.  Support for this is
+    limited.  Accidentals will collide with scripts.
+    
+  @item @code{slurVerticalDirection}
+@cindex slurVerticalDirection@@@code{slurVerticalDirection}
+ @* 
+    Set to @code{\free} for free choice of slur direction, set to
+    @code{\up} to force slurs up, set to @code{\down} to force slurs
+    down.  The shorthands @code{\slurup}
+@cindex slurup@@@code{\slurup}
+,
+    @code{\slurdown}
+@cindex slurdown@@@code{\slurdown}
+, and
+    @code{\slurboth}
+@cindex slurboth@@@code{\slurboth}
+ are available.
+
+  @item @code{slurDash}
+@cindex slurDash@@@code{slurDash}
+ @* 
+    Set to 0 for normal slurs, 1 for dotted slurs, and a
+    larger value for dashed slurs.  Identifiers
+    @code{\slurnormal}
+@cindex slurnormal@@@code{\slurnormal}
+ and
+    @code{\slurdotted}
+@cindex slurdotted@@@code{\slurdotted}
+ are predefined to set the
+    first two settings.
+
+@item @code{stemLength}
+@cindex stemLength@@@code{stemLength}
+ @* 
+    Set length of stems.  Unit is `@code{interline}/2', so
+    @code{stemLength} defaults to 7.
+
+  @item @code{stemLeftBeamCount}
+@cindex stemLeftBeamCount@@@code{stemLeftBeamCount}
+ @* 
+    Specify the number of beams to draw on the left side of the next
+    note.  Overrides automatic beaming.  The value is only used once,
+    and then it is erased.
+
+  @item @code{stemRightBeamCount}
+@cindex stemRightBeamCount@@@code{stemRightBeamCount}
+ @* 
+    Specify the number of beams to draw on the right side of the next
+    note.  Overrides automatic beaming.  The value is only used once,
+    and then it is erased.
+  @item @code{tieVerticalDirection}
+@cindex tieVerticalDirection@@@code{tieVerticalDirection}
+ @* 
+    Set to @code{\free} for free choice of tie direction, set to
+    @code{\up} to force ties up, set to @code{\down} to force ties
+    down.
+
+  @item @code{transposing}
+@cindex transposing@@@code{transposing}
+ @* 
+    Transpose the MIDI output.  Set this property to the number of
+    half-steps to transpose by.
+
+  
+  @item @code{textEmptyDimension}
+@cindex textEmptyDimension@@@code{textEmptyDimension}
+ @* 
+    If set to 1 then text placed above or below the staff is
+    assumed to have zero width.
+  
+  @item @code{textStyle}
+@cindex textStyle@@@code{textStyle}
+ @* 
+    Set the text style for superscripts and subscripts.  See above
+    for list of text styles.
+
+  @item @code{textScriptPadding}
+@cindex textScriptPadding@@@code{textScriptPadding}
+ @* 
+    Determines the extra space added between superscripted resp.
+    subscripted text and the closest staff line or note.
+
+  @item @code{verticalDirection}
+@cindex verticalDirection@@@code{verticalDirection}
+ @* 
+    Determines the direction of stems, subscripts, beams, slurs, and
+    ties.  Set to @code{\down} to force them down, @code{\up} to force
+    them up, or @code{\free} to let LilyPond decide.  This can be used
+    to distinguish between voices on the same staff.  The
+    @code{\stemdown}
+@cindex stemdown@@@code{\stemdown}
+, @code{\stemup}
+@cindex stemup@@@code{\stemup}
+,
+    and @code{\stemboth}
+@cindex stemboth@@@code{\stemboth}
+ identifiers set this
+    property.
+    
+
+  @item @code{tupletDirection}
+@cindex tupletDirection@@@code{tupletDirection}
+ @* 
+    Determines the direction of triplets and other tuplets.  Set to
+    @code{\down} to force them below the staff, @code{\up} to force
+    them above, or @code{\free} to let LilyPond decide.
+
+  @item @code{tupletVisibility}
+@cindex tupletVisibility@@@code{tupletVisibility}
+ @* 
+    Determines whether tuplets of notes are labelled.  Setting
+    to 0 shows nothing; setting to 1 shows a number;
+    setting to 2 shows a number and a bracket if there is no
+    beam; setting to 3 shows a number, and if there is no beam
+    it adds a bracket; setting to 4 shows both a number and a
+    bracket unconditionally.
+
+@end table
+
+@subsubheading Staff properties
+
+@cindex properties!Staff
+
+@table @samp
+  @item @code{barNonAuto}
+@cindex barNonAuto@@@code{barNonAuto}
+ @* 
+    If set to 1 then bar lines will not be printed
+    automatically; they must be explicitly created with @code{\bar}
+    keywords.  Unlike with the @code{\cadenza} keyword, measures are
+    still counted.  Bar generation will resume according to that
+    count if this property is set to zero.
+
+  @item @code{barNumberDirection}
+@cindex barNumberDirection@@@code{barNumberDirection}
+ @* 
+    Set to @code{\up} or @code{\down} to put bar numbers above or below
+    the staff.
+
+  @item @code{barNumberHangOnClef}
+@cindex barNumberHangOnClef@@@code{barNumberHangOnClef}
+ @* 
+    Set to 1 to cause bar numbers to appear above or below the
+    clef instead of on the bar line.  This property is deprecated. 
+    Do not use.
+
+  @item @code{barNumberScriptPadding}
+@cindex barNumberScriptPadding@@@code{barNumberScriptPadding}
+ @* 
+    Sets extra space between the bar number and the bar it labels.
+
+  @item @code{barSize}
+@cindex barSize@@@code{barSize}
+ @* 
+    Specify the height of the bar lines if it should be different
+    than the staff height.
+
+  @item @code{barAtLineStart}
+@cindex barAtLineStart@@@code{barAtLineStart}
+ @* 
+    Set to 1 to produce a bar line after the clef at the start
+    of each line (but not at the beginning of the music).
+
+  @item @code{clefStyle}
+@cindex clefStyle@@@code{clefStyle}
+ @* 
+    Determines how clefs are typeset.  If set to @code{transparent},
+    the clefs are not printed at all, if set to
+    @code{fullSizeChanges}, clef changes in the middle of a line are
+    typeset with a full size clef.  By default, clef changes are
+    typeset in smaller size.
+
+  @item @code{createKeyOnClefChange}
+@cindex createKeyOnClefChange@@@code{createKeyOnClefChange}
+ @* 
+    Set to a nonempty string if you want key signatures to be printed
+    when the clef changes.  Set to the empty string if you do not
+    want key signatures printed.
+
+  @item @code{createInitdefaultClef}
+@cindex createInitdefaultClef@@@code{createInitdefaultClef}
+ @* 
+    Specify whether clefs are created on default?  (Doesn't seem to
+    do anything.)
+
+  @item @code{defaultClef}
+@cindex defaultClef@@@code{defaultClef}
+ @* 
+    Determines the default clef.  See @code{\clef} keyword.
+
+  @item @code{markHangOnClef}
+@cindex markHangOnClef@@@code{markHangOnClef}
+ @* 
+    Set to 1 to cause marks to appear by clefs instead of by bar
+    lines.  Deprecated, use is not recommended.
+
+  @item @code{marginDirection}
+@cindex marginDirection@@@code{marginDirection}
+ @* 
+    Set to @code{\left} or @code{\right} to specify location of
+    marginal scripts.
+
+  @item @code{marginScriptPadding}
+@cindex marginScriptPadding@@@code{marginScriptPadding}
+ @* 
+    Specify extra space for marginal scripts.
+
+  @item @code{forgetAccidentals}
+@cindex forgetAccidentals@@@code{forgetAccidentals}
+ @* 
+    Causes accidentals to be printed at every note instead of
+    remembered for the duration of a measure.
+
+  @item @code{noResetKey}
+@cindex noResetKey@@@code{noResetKey}
+ @* 
+    Do not reset the key at the start of a measure.  Accidentals will
+    be printed only once and are in effect until overridden, possibly
+    many measures later.
+
+  @item @code{staffLineLeading}
+@cindex staffLineLeading@@@code{staffLineLeading}
+ @* 
+    Specifies the distance (in points) between lines of the staff.
+
+  @item @code{numberOfStaffLines}
+@cindex numberOfStaffLines@@@code{numberOfStaffLines}
+ @* 
+    Specifies the number of staff lines.  The default is 5.
+
+  @item @code{postBreakPadding}
+@cindex postBreakPadding@@@code{postBreakPadding}
+ @* 
+    Extra space in points to be added after the clef, time signature
+    and key signature on the staff.  Deprecated, do not use.
+
+  @item @code{noVoltaBraces}
+@cindex noVoltaBraces@@@code{noVoltaBraces}
+ @* 
+    Set to true to suppress the printing of brackets over alternate
+    endings specified by the command @code{\alternative}.
+
+  @item @code{numberOfStaffLines}
+@cindex numberOfStaffLines@@@code{numberOfStaffLines}
+ @* 
+    Sets the number of lines that the staff has.
+  @item @code{barAlways}
+@cindex barAlways@@@code{barAlways}
+ @* 
+    If set to 1 a bar line is drawn after each note.
+
+  @item @code{defaultBarType}
+@cindex defaultBarType@@@code{defaultBarType}
+ @* 
+    Sets the default type of bar line. See Section @xref{barlines} 
+    for a list of available bar types.
+
+  @item @code{instrument}, @code{instr}
+    
+@cindex instrument@@@code{instrument}
+
+@cindex instr@@@code{instr}
+ @* 
+    If @code{Staff_margin_engraver}
+@cindex Staff_margin_engraver
+ is
+    added to the Staff translator, then the @code{instrument} property
+    is used to label the first line of the staff and the @code{instr}
+    property is used to label subsequent lines.  If the
+    @code{midiInstrument} property is not set, then @code{instrument}
+    is used to determine the instrument for MIDI output.
+
+  @item @code{keyOctaviation}
+@cindex keyOctaviation@@@code{keyOctaviation}
+ @* 
+    If set to 1, then keys are the same in all octaves.  If set
+    to 0 then the key signature for different octaves can be
+    different and is specified independently:
+
+    @quotation
+
+      @code{\keysignature bes fis'}
+    @end quotation
+
+    The default value is 1.  Can be set to zero with
+    @code{\specialkey} or reset to 1 with @code{\normalkey}.
+
+  @item @code{timeSignatureStyle}
+@cindex timeSignatureStyle@@@code{timeSignatureStyle}
+ @* 
+    Changes the default two-digit layout for time signatures.  The
+    following values are recognized:
+
+    @table @samp
+      @item @code{C}
+@cindex C@@@code{C}
+ @* 
+        4/4 and 2/2 are typeset as C and struck C, respectively.  All
+        other time signatures are written with two digits.
+
+      @item @code{old}
+@cindex old@@@code{old}
+ @* 
+        2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and 9/8 are
+        typeset with old-style mensuration marks.  All other time
+        signatures are written with two digits.
+
+      @item @code{1}
+@cindex 1@@@code{1}
+ @* 
+        All time signatures are typeset with a single
+        digit, e.g. 3/2 is written as 3.
+
+      @item 
+@cindex CM/N@@@code{CM/N}
+@code{C}@code{/}, 
+      
+@cindex oldM/N@@@code{oldM/N}
+@code{old}@code{/} or
+      @code{old6/8alt}
+@cindex old6/8alt@@@code{old6/8alt}
+ @* 
+        Tells LilyPond to use a specific symbol as time signature.
+    @end table
+
+    The different time signature characters are shown below with its
+    names:
+
+    @mudela[center]
+
+      \score {
+        \notes\relative c'' {
+          \property Voice.textStyle = typewriter
+          \property Staff.timeSignatureStyle = "C2/2"
+          \time 2/2; a2^"C2/2" a2 
+          \property Staff.timeSignatureStyle = "C4/4"
+          \time 2/2; a2^"C4/4" a2 
+          \property Staff.timeSignatureStyle = "old2/2"
+          \time 2/2; a2^"old2/2" a2 
+          \property Staff.timeSignatureStyle = "old3/2"
+          \time 2/2; a2^"old3/2" a2 
+          \property Staff.timeSignatureStyle = "old2/4"
+          \time 2/2; a2^"old2/4" a2 
+          \property Staff.timeSignatureStyle = "old4/4"
+          \time 2/2; a2^"old4/4" a2 
+          \property Staff.timeSignatureStyle = "old6/4"
+          \time 2/2; a2^"old6/4" a2 
+          \property Staff.timeSignatureStyle = "old9/4"
+          \time 2/2; a2^"old9/4" a2 
+          \property Staff.timeSignatureStyle = "old4/8"
+          \time 2/2; a2^"old4/8" a2 
+          \property Staff.timeSignatureStyle = "old6/8"
+          \time 2/2; a2^"old6/8" a2 
+          \property Staff.timeSignatureStyle = "old6/8alt"
+          \time 2/2; a2^"old6/8alt" a2 
+          \property Staff.timeSignatureStyle = "old9/8"
+          \time 2/2; a2^"old9/8" a2 
+        }
+        \paper {
+          linewidth = 4.5 \in;
+        }
+      }
+    
+@end mudela
+
+  @item @code{voltaSpannerDuration}
+@cindex voltaSpannerDuration@@@code{voltaSpannerDuration}
+ @* 
+    Set to an integer to control the size of the brackets printed by
+    @code{\alternative}.  The integer specifies the number of whole
+    notes duration to use for the brackets.  It is rounded to the
+    nearest measure.  This can be used to shrink the length of
+    brackets in the situation where one alternative is very large. 
+    It may have odd effects if the specified duration is longer than
+    the music given in an @code{\alternative}.
+@end table
+   
+
+@cindex properties!GrandStaff
+
+@table @samp 
+  @item @code{alignmentReference}
+@cindex alignmentReference@@@code{alignmentReference}
+ @* 
+    Set to @code{\center} for vertical alignment reference point to be
+    in the center of the vertical group.  Set to @code{\up} to put the
+    reference point at the top of the group.
+
+  @item @code{maxVerticalAlign}
+@cindex maxVerticalAlign@@@code{maxVerticalAlign}
+ @* 
+    Set the maximum vertical distance between staffs.
+
+  @item @code{minVerticalAlign}
+@cindex minVerticalAlign@@@code{minVerticalAlign}
+ @* 
+    Set the minimum vertical distance between staffs.  
+@end table
+
+
+@cindex properties!Score
+
+@table @samp
+  @item @code{skipBars}
+@cindex skipBars@@@code{skipBars}
+ @* 
+    Set to 1 to skip the empty bars that are produced by
+    multimeasure notes and rests.  These bars will not appear on the
+    printed output.  Set to zero (the default) to expand multimeasure
+    notes and rests into their full length, printing the appropriate
+    number of empty bars so that synchronization with other voices is
+    preserved.
+
+    @quotation
+
+@mudela[fragment,verbatim,center]
+r1 r1*3 R1*3\property Score.skipBars=1 r1*3 R1*3
+
+@end mudela
+    @end quotation
+
+@end table
+
+
+@cindex properties!ChordNamesVoice
+
+@table @samp
+  @item @code{chordInversion}
+@cindex chordInversion@@@code{chordInversion}
+ @* 
+    Determines whether LilyPond should look for chord inversions when
+    translating from notes to chord names.  Set to 1 to find
+    inversions.  The default is 0 which does not look for
+    inversions.
+@end table
+
+
+
+@node Notation output definitions, output, contextselection, LilyPond 1-2-0 Reference Manual
+@section Notation output definitions
+
+@cindex output
+
+@cindex notation output
+
+@cindex output definition
+
+@node output, paper, Notation output definitions, LilyPond 1-2-0 Reference Manual
+
+@node paper, papervars, output, LilyPond 1-2-0 Reference Manual
+
+The most important output definition is the @code{\paper} block, for
+music notation.  The syntax is
+
+@quotation
+
+  @code{\paper @{} []  @code{@}}
+@end quotation
+
+where each of the items is one of
+
+@itemize @bullet
+  @item  An assignment.  The assignment must be terminated by a
+       semicolon.  See section @xref{papervars} for information on
+       paper variables.
+
+  @item  A context definition.  See section @xref{contextdefs} for
+       more information on context definitions.
+
+  @item  A margin shape declaration.  The syntax is
+
+       @quotation
+
+         @code{\shape} @code{,} @code{,}
+                      @code{,}  ... @code{;}
+       @end quotation
+
+       
+@cindex shape@@@code{\shape}
+
+       Each pair of  and  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.
+
+  @item  A font declaration.  Its syntax is
+
+       @quotation
+
+          @code{=} @code{\font}
+@cindex font@@@code{\font}
+       @end quotation
+
+        is an integer describing the font to be used. 
+       0 is the default font.   is the basename of
+       a font (usually a member of the Feta family).
+@end itemize
+
+
+
+@cindex changing font size and paper size
+
+The Feta font provides musical symbols at six different sizes.  These
+fonts are 11 point, 13 point, 16 point, 20 point,
+23 point, and 26 point.  The point size of a font is the
+height of the five lines in a staff when displayed in the font.
+
+Definitions for these sizes are the files @file{paperSZ.ly}, where
+@code{SZ} is one of 11, 13, 16, 20, 23 and 26.  If you include
+any of these files, the identifiers @code{paper_eleven},
+@code{paper_thirteen}, @code{paper_sixteen}, @code{paper_twenty},
+@code{paper_twentythree}, and @code{paper_twentysix} are defined
+respectively.  The default @code{\paper} block is also set.
+
+To change the paper size, you must first set the
+@code{papersize}
+@cindex papersize@@@code{papersize}
+ variable at top level.  Set it to the strings
+@code{a4}, @code{letter}, or @code{legal}.  After this specification,
+you must set the font as described above.  If you want the default
+font, then use the 20 point font.  The new paper size will not
+take effect if the font is not loaded and selected afterwards.  Paper
+size selection works by loading a file named after the paper size you
+select.
+
+
+
+@cindex paper variables
+
+@node papervars, contextdefs, paper, LilyPond 1-2-0 Reference Manual
+
+There is a large number of paper variables that are used to control
+details of the layout.  These variables control the defaults for the
+entire score.  Usually, they do not have to be changed; they are by
+default set to values that depend on the font size in use.  The
+values are used by the graphic objects while formatting the score;
+they are therefore implementation dependent.  Most variables are
+accompanied by documentation in the initalization file
+@file{params.ly} or @file{paperSZ.ly}, where @code{SZ} is the staff
+height in points.
+
+Nevertheless, here are some variables you may want to use or change:
+
+@table @samp
+  @item @code{indent}
+@cindex indent@@@code{indent}
+ @* 
+    The indentation of the first line of music.
+
+  @item @code{interline}
+@cindex interline@@@code{interline}
+ @* 
+    The distance between two staff lines, calculated from the center
+    of the lines.  You should use either this or @code{rulethickness}
+    as a unit for distances you modify.
+  
+  @item @code{linewidth}
+@cindex linewidth@@@code{linewidth}
+ @* 
+    Sets the width of the lines.  If set to -1.0, a single
+    unjustified line is produced.
+
+  @item @code{output}
+@cindex output@@@code{output}
+ @* 
+    Specifies an alternate name for the the output @file{s}.
+    A @file{.tex}, @file{.midi} or @file{.ps} extension will be 
+    added to the string you specify.
+
+  @item @code{rulethickness}
+@cindex rulethickness@@@code{rulethickness}
+ @* 
+    Determines the thickness of staff and bar lines. 
+
+  @item @code{castingalgorithm}
+@cindex castingalgorithm@@@code{castingalgorithm}
+ @* 
+    The algorithm to use for breaking lines.  Choices are
+    @code{\Gourlay}
+@cindex Gourlay@@@code{\Gourlay}
+ for a TeX-like dynamic
+    programming algorithm, and @code{\Wordwrap}
+@cindex Wordwrap@@@code{\Wordwrap}
+ for
+    a simple algorithm.  Gourlay breaking looks much better, but
+    takes a lot more resources.  Wordwrap leaves loosely spaced lines
+    at the end.
+@end table
+
+
+@node contextdefs, engravers, papervars, LilyPond 1-2-0 Reference Manual
+
+@cindex context definition
+
+A notation contexts is defined by the following information
+
+@enumerate i
+  @item  A name.
+
+  @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.
+
+  @item  What other contexts the context can contain,
+
+  @item  What properties are defined.
+@end enumerate
+
+A context definition has this syntax:
+
+@quotation
+
+  @code{\translator} @code{@{}
+                       
+                    @code{@}}
+@end quotation
+
+ can be an identifier or of the form
+
+@quotation
+
+  @code{\type}  @code{;}
+@end quotation
+
+ is one of
+
+@table @samp
+  @item @code{Engraver_group_engraver}
+@cindex Engraver_group_engraver@@@code{Engraver_group_engraver}
+ @* 
+    The standard cooperation engraver.
+
+  @item @code{Score_engraver}
+@cindex Score_engraver@@@code{Score_engraver}
+ @* 
+    This is cooperation module that should be in the top level context.
+
+  @item @code{Grace_engraver_group}
+@cindex Grace_engraver_group@@@code{Grace_engraver_group}
+ @* 
+    This is a special cooperation module (resembling
+    @code{Score_engraver}) that is used to created an embedded
+    `miniscore'.
+@end table 
+
+ is a list of items where each item is
+one of
+
+@itemize @bullet
+  @item  @code{\consists}  @code{;} @* 
+    Add  to the list of modules in this context. 
+    Section @xref{engravers} contains an overview of the engravers
+    available.  The order of engravers added with @code{\consists} is
+    significant.
+  
+  @item  @code{\consistsend}  @code{;} @* 
+    Analogous to @code{\consists}, but makes sure that
+     is always added to the end of the list of
+    engravers.
+
+    Some engraver types need to be at the end of the list; this
+    insures they are put there, and stay there, if a user adds or
+    removes engravers.  This command is usually not needed for
+    end-users.
+    
+  @item  @code{\accepts}  @code{;} @* 
+    Add  to the list of  context this context can
+    contain.  The first listed context the context to create by
+    default.
+  
+  @item  @code{\remove}  @code{;} @* 
+    Remove a previously added (with @code{\consists}) engraver.
+  
+  @item  @code{\name}  @code{;} @* 
+    This sets name of the context, e.g. @code{Staff}, @code{Voice}.  If
+    the name is not specified, the translator won't do anything.
+
+  @item   @code{=}  @code{;} @* 
+    A property assignment.  It is allowed to use reals for
+    .
+@end itemize
+
+In the @code{\paper} block, it is also possible to define translator
+identifiers.  Like other block identifiers, the identifier can only
+be used as the very first item of a translator.  In order to define
+such an identifier outside of @code{\score}, you must do
+
+@quotation
+
+@example 
+\paper @{
+  foo = \translator @{ ... @}
+@}
+\score @{
+  \notes @{
+    ...
+  @}
+  \paper @{
+    \translator @{ \foo ... @}
+  @}
+@} 
+@end example 
+
+@end quotation
+
+
+@cindex paper types, engravers, and pre-defined translators
+
+Some pre-defined identifiers can simplify modification of
+translators.  The pre-defined identifiers are:
+
+@table @samp
+  @item @code{StaffContext}
+@cindex StaffContext@@@code{StaffContext}
+ @* 
+    Default Staff context. 
+
+  @item @code{RhythmicStaffContext}
+@cindex RhythmicStaffContext@@@code{RhythmicStaffContext}
+ @* 
+    Default RhythmicStaff context. 
+
+  @item @code{VoiceContext}
+@cindex VoiceContext@@@code{VoiceContext}
+ @* 
+    Default Voice context.  
+
+  @item @code{ScoreContext}
+@cindex ScoreContext@@@code{ScoreContext}
+ @* 
+    Default Score context. 
+
+  @item @code{ScoreWithNumbers}
+@cindex ScoreWithNumbers@@@code{ScoreWithNumbers}
+ @* 
+    Score context with numbering at the Score level.
+
+  @item @code{BarNumberingStaffContext}
+@cindex BarNumberingStaffContext@@@code{BarNumberingStaffContext}
+ @* 
+    Staff context with numbering at the Staff level.
+
+  @item @code{HaraKiriStaffContext}
+@cindex HaraKiriStaffContext@@@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 Samourai.}
+
+  @item @code{OrchestralPartStaffContext}
+@cindex OrchestralPartStaffContext@@@code{OrchestralPartStaffContext}
+
+  @item @code{OrchestralScoreContext}
+@cindex OrchestralScoreContext@@@code{OrchestralScoreContext}
+
+@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
+
+      
+
+@node engravers, Sound output, contextdefs, LilyPond 1-2-0 Reference Manual
+
+The engravers for paper output are:
+
+[incomplete, FIXME]
+
+@table @samp
+  @item @code{Bar_engraver}
+@cindex Bar_engraver@@@code{Bar_engraver}
+ @* 
+    Engraves bar lines.  Normally in @code{Staff} and
+    @code{RhythmicStaff}.
+
+  @item @code{Bar_number_engraver}
+@cindex Bar_number_engraver@@@code{Bar_number_engraver}
+ @* 
+    Engrave bar numbers.  These numbers appear at the start of each
+    line.  Not normally in any translator.  Can be added to
+    @code{Score} for score-wide numbering or to @code{Staff} for
+    numbering on each staff.
+
+  @item @code{Beam_engraver}
+@cindex Beam_engraver@@@code{Beam_engraver}
+ @* 
+    Handles beam requests by engraving beams.  Normally appears in
+    the @code{Voice} translator.  If omitted, then notes will be
+    printed with flags instead of beams.
+
+  @item @code{Beam_req_swallow_translator}
+    
+@cindex Beam_req_swallow_translator@@@code{Beam_req_swallow_translator}
+ @* 
+    Swallows beam requests.  In @code{LyricVoice}.  
+
+  @item @code{Chord_name_engraver}
+@cindex Chord_name_engraver@@@code{Chord_name_engraver}
+ @* 
+    Engraves chord names.  Normally in @code{ChordNameVoice} .
+
+  @item @code{Chord_tremolo_engraver}
+@cindex Chord_tremolo_engraver@@@code{Chord_tremolo_engraver}
+
+  @item @code{Clef_engraver}
+@cindex Clef_engraver@@@code{Clef_engraver}
+ @* 
+    Engraves the clef symbol.  Normally in @code{Staff}.
+
+  @item @code{Collision_engraver}
+@cindex Collision_engraver@@@code{Collision_engraver}
+
+  @item @code{Dot_column_engraver}
+@cindex Dot_column_engraver@@@code{Dot_column_engraver}
+ @* 
+    Engraves dots on dotted notes shifted to the right of the note. 
+    Normally in @code{Voice}.  If omitted, then dots appear on top of
+    the notes.
+
+  @item @code{Dynamic_engraver}
+@cindex Dynamic_engraver@@@code{Dynamic_engraver}
+ @* 
+    Engraves dynamics symbols.  Normally in @code{Voice}.
+
+  @item @code{Font_size_engraver}
+@cindex Font_size_engraver@@@code{Font_size_engraver}
+
+  @item @code{Key_engraver}
+@cindex Key_engraver@@@code{Key_engraver}
+ @* 
+    Engraves the key signature.  Normally in @code{Staff}.
+
+  @item @code{Local_key_engraver}
+@cindex Local_key_engraver@@@code{Local_key_engraver}
+
+  @item @code{Lyric_engraver}
+@cindex Lyric_engraver@@@code{Lyric_engraver}
+ @* 
+    Engraves lyrics.  Normally in @code{LyricVoice}.
+
+  @item @code{Multi_measure_rest_engraver}
+    
+@cindex Multi_measure_rest_engraver@@@code{Multi_measure_rest_engraver}
+ @* 
+    Engraves multi-measure rests that are produced with @code{R}. 
+    Normally in @code{Voice}.
+
+  @item @code{Piano_bar_engraver}
+@cindex Piano_bar_engraver@@@code{Piano_bar_engraver}
+
+  @item @code{Pitch_squash_engraver}
+@cindex Pitch_squash_engraver@@@code{Pitch_squash_engraver}
+ @* 
+    Treat all pitches as middle C.  Used in @code{RhythmicStaff}. 
+    Note that the notes move, but the locations of accidentals stay
+    the same.
+
+  @item @code{Priority_horizontal_align_engraver}
+    
+@cindex Priority_horizontal_align_engraver@@@code{Priority_horizontal_align_engraver}
+
+  @item @code{Repeat_engraver}
+@cindex Repeat_engraver@@@code{Repeat_engraver}
+ @* 
+    Handles repeats?  In @code{Staff} and @code{RhythmicStaff}.
+
+  @item @code{Rest_collision_engraver}
+@cindex Rest_collision_engraver@@@code{Rest_collision_engraver}
+ @* 
+    Handles collisions of rests.  In @code{Staff}.
+
+  @item @code{Rest_engraver}
+@cindex Rest_engraver@@@code{Rest_engraver}
+ @* 
+    Engraves rests.  Normally in @code{Voice}.
+
+  @item @code{Rhythmic_column_engraver}
+@cindex Rhythmic_column_engraver@@@code{Rhythmic_column_engraver}
+
+  @item @code{Score_priority_engraver}
+@cindex Score_priority_engraver@@@code{Score_priority_engraver}
+
+  @item @code{Script_engraver}
+@cindex Script_engraver@@@code{Script_engraver}
+ @* 
+    Handles note ornaments generated by @code{\script}.  Normally in
+    @code{Voice}.
+
+  @item @code{Separating_line_group_engraver}
+    
+@cindex Separating_line_group_engraver@@@code{Separating_line_group_engraver}
+
+  @item @code{Skip_req_swallow_translator}
+    
+@cindex Skip_req_swallow_translator@@@code{Skip_req_swallow_translator}
+
+  @item @code{Slur_engraver}
+@cindex Slur_engraver@@@code{Slur_engraver}
+ @* 
+    Engraves slurs.  Normally in @code{Voice}.
+
+  @item @code{Span_bar_engraver}
+@cindex Span_bar_engraver@@@code{Span_bar_engraver}
+ @* 
+    Engraves lines across multiple staffs.  Normally in
+    @code{Staffgroup} and @code{GrandStaff}.  Removing this from
+    @code{StaffGroup} gives the definition of @code{ChoirStaff}.
+
+  @item @code{Span_score_bar_engraver}
+@cindex Span_score_bar_engraver@@@code{Span_score_bar_engraver}
+
+  @item @code{Staff_group_bar_engraver}
+@cindex Staff_group_bar_engraver@@@code{Staff_group_bar_engraver}
+
+  @item @code{Staff_margin_engraver}
+@cindex Staff_margin_engraver@@@code{Staff_margin_engraver}
+ @* 
+    Prints the name of the instrument (specified by
+    @code{Staff.instrument} and @code{Staff.instr}) at the left of the
+    staff.
+
+  @item @code{Staff_sym_engraver}
+@cindex Staff_sym_engraver@@@code{Staff_sym_engraver}
+
+  @item @code{Stem_engraver}
+@cindex Stem_engraver@@@code{Stem_engraver}
+ @* 
+    Engraves stems.  Normally in @code{Voice}.
+
+  @item @code{Ties_engraver}
+@cindex Ties_engraver@@@code{Ties_engraver}
+ @* 
+    Engraves ties.  Normally in @code{Voice}.
+
+  @item @code{Time_signature_engraver}
+@cindex Time_signature_engraver@@@code{Time_signature_engraver}
+ @* 
+    Engraves the time signature.  Normally in @code{Staff} and
+    @code{RhythmicStaff}.
+
+  @item @code{Timing_engraver}
+@cindex Timing_engraver@@@code{Timing_engraver}
+ @* 
+    Responsible for synchronizing timing information from staffs. 
+    Normally in @code{Score}.  In order to create polyrhythmic music,
+    this engraver should be removed from @code{Score} and placed in
+    @code{Staff}.
+
+  @item @code{Tuplet_engraver}
+@cindex Tuplet_engraver@@@code{Tuplet_engraver}
+ @* 
+    Engraves tuplet brackets?  In @code{Staff}.
+
+  @item @code{Vertical_align_engraver}
+@cindex Vertical_align_engraver@@@code{Vertical_align_engraver}
+@end table
+
+
+
+@node Sound output, midilist, engravers, LilyPond 1-2-0 Reference Manual
+@section Sound output
+
+
+
+The MIDI block is analogous to the paper block, but it is simpler.
+The @code{\midi} block can contain:
+@cindex MIDI block
+
+@itemize @bullet
+  @item  a @code{\tempo} definition
+  @item  context definitions
+@end itemize
+
+Assignments in the @code{\midi} block are not allowed.
+
+
+
+@cindex context definition
+
+Context definitions follow precisely the same syntax as within the
+\paper block.  Translation modules for sound are called performers.
+The contexts for MIDI output are defined in @file{ly/performer.ly}.
+
+
+
+@cindex MIDI instrument names
+
+@node midilist, Pre-defined Identifiers, Sound output, LilyPond 1-2-0 Reference Manual
+
+The MIDI instrument name is set by the
+@code{Staff.midiInstrument}
+@cindex Staff.midiInstrument@@@code{Staff.midiInstrument}
+ property or, if that property is
+not set, the @code{Staff.instrument}
+@cindex Staff.instrument@@@code{Staff.instrument}
+ property.  The instrument
+name should be chosen from the following list.  If the selected
+string does not exactly match, then LilyPond uses the default piano.
+
+
+@quotation
+
+@example 
+"acoustic grand"            "contrabass"           "lead 7 (fifths)"
+"bright acoustic"           "tremolo strings"      "lead 8 (bass+lead)"
+"electric grand"            "pizzicato strings"    "pad 1 (new age)"
+"honky-tonk"                "orchestral strings"   "pad 2 (warm)"
+"electric piano 1"          "timpani"              "pad 3 (polysynth)"
+"electric piano 2"          "string ensemble 1"    "pad 4 (choir)"
+"harpsichord"               "string ensemble 2"    "pad 5 (bowed)"
+"clav"                      "synthstrings 1"       "pad 6 (metallic)"
+"celesta"                   "synthstrings 2"       "pad 7 (halo)"
+"glockenspiel"              "choir aahs"           "pad 8 (sweep)"
+"music box"                 "voice oohs"           "fx 1 (rain)"
+"vibraphone"                "synth voice"          "fx 2 (soundtrack)"
+"marimba"                   "orchestra hit"        "fx 3 (crystal)"
+"xylophone"                 "trumpet"              "fx 4 (atmosphere)"
+"tubular bells"             "trombone"             "fx 5 (brightness)"
+"dulcimer"                  "tuba"                 "fx 6 (goblins)"
+"drawbar organ"             "muted trumpet"        "fx 7 (echoes)"
+"percussive organ"          "french horn"          "fx 8 (sci-fi)"
+"rock organ"                "brass section"        "sitar"
+"church organ"              "synthbrass 1"         "banjo"
+"reed organ"                "synthbrass 2"         "shamisen"
+"accordion"                 "soprano sax"          "koto"
+"harmonica"                 "alto sax"             "kalimba"
+"concertina"                "tenor sax"            "bagpipe"
+"acoustic guitar (nylon)"   "baritone sax"         "fiddle"
+"acoustic guitar (steel)"   "oboe"                 "shanai"
+"electric guitar (jazz)"    "english horn"         "tinkle bell"
+"electric guitar (clean)"   "bassoon"              "agogo"
+"electric guitar (muted)"   "clarinet"             "steel drums"
+"overdriven guitar"         "piccolo"              "woodblock"
+"distorted guitar"          "flute"                "taiko drum"
+"guitar harmonics"          "recorder"             "melodic tom"
+"acoustic bass"             "pan flute"            "synth drum"
+"electric bass (finger)"    "blown bottle"         "reverse cymbal"
+"electric bass (pick)"      "skakuhachi"           "guitar fret noise"
+"fretless bass"             "whistle"              "breath noise"
+"slap bass 1"               "ocarina"              "seashore"
+"slap bass 2"               "lead 1 (square)"      "bird tweet"
+"synth bass 1"              "lead 2 (sawtooth)"    "telephone ring"
+"synth bass 2"              "lead 3 (calliope)"    "helicopter"
+"violin"                    "lead 4 (chiff)"       "applause"
+"viola"                     "lead 5 (charang)"     "gunshot"
+"cello"                     "lead 6 (voice)" 
+@end example 
+
+@end quotation
+
+
+@cindex MIDI types and performers
+
+The types available for  MIDI translators are:
+
+@table @samp
+  @item @code{Performer_group_performer}
+@cindex Performer_group_performer@@@code{Performer_group_performer}
+
+  @item @code{Score_performer}
+@cindex Score_performer@@@code{Score_performer}
+
+  @item @code{Staff_performer}
+@cindex Staff_performer@@@code{Staff_performer}
+
+@end table
+
+The performers for MIDI translators are:
+
+@table @samp
+  @item @code{Key_performer}
+@cindex Key_performer@@@code{Key_performer}
+
+  @item @code{Time_signature_performer}
+@cindex Time_signature_performer@@@code{Time_signature_performer}
+
+  @item @code{Note_performer}
+@cindex Note_performer@@@code{Note_performer}
+
+  @item @code{Lyric_performer}
+@cindex Lyric_performer@@@code{Lyric_performer}
+
+  @item @code{Swallow_performer}
+@cindex Swallow_performer@@@code{Swallow_performer}
+
+@end table
+
+
+
+@node Pre-defined Identifiers, ident, midilist, LilyPond 1-2-0 Reference Manual
+@section Pre-defined Identifiers
+
+@cindex pre-defined identifiers
+
+@node ident, Running LilyPond, Pre-defined Identifiers, LilyPond 1-2-0 Reference Manual
+
+Various identifiers are defined in the initialization files to
+provide shorthands for some settings.  Most of them are in
+@file{ly/declarations.ly}.
+
+@table @samp
+  @item @code{\break}
+@cindex break@@@code{\break}
+ @* 
+    Force a line break in music by using a large argument for the
+    keyword @code{\penalty}.
+
+  @item @code{\center}
+@cindex center@@@code{\center}
+ @* 
+    Used for setting direction  properties.  Equals 0.
+
+  @item @code{\down}
+@cindex down@@@code{\down}
+ @* 
+    Used for setting direction setting properties.  Is equal
+    to -1.
+
+  @item @code{\free}
+@cindex free@@@code{\free}
+ @* 
+    Used for setting direction setting properties.  Is equal
+    to 0.
+
+  @item @code{\left}
+@cindex left@@@code{\left}
+ @* 
+    Used for setting text alignment property.  Is equal to -1.
+
+  @item @code{\nobreak}
+@cindex nobreak@@@code{\nobreak}
+ @* 
+    Prevent a line break in music by using a large negative argument
+    for the keyword @code{\penalty}.
+
+  @item @code{\none}
+@cindex none@@@code{\none}
+ @* 
+    Used for setting @code{Score.beamslopedamping} and
+    @code{Score.beamquantisation} properties.  Is equal to 0.
+
+  @item @code{\normal}
+@cindex normal@@@code{\normal}
+ @* 
+    Used for setting @code{Score.beamslopedamping} and
+    @code{Score.beamquantisation} properties.  Is equal to 1.
+
+  @item @code{\normalkey}
+@cindex normalkey@@@code{\normalkey}
+ @* 
+    Select normal key signatures where each octave has the same key
+    signature.  This sets the @code{Staff.keyoctaviation} property.
+
+  @item @code{\right}
+@cindex right@@@code{\right}
+ @* 
+    Used for setting text alignment property.  Is set to 1.
+
+  @item @code{\shiftoff}
+@cindex shiftoff@@@code{\shiftoff}
+ @* 
+    Disable horizontal shifting of note heads that collide.  Sets the
+    @code{Voice.horizontalNoteShift} property.
+
+  @item @code{\shifton}
+@cindex shifton@@@code{\shifton}
+ @* 
+    Enable note heads that collide with other note heads to be
+    shifted horiztonally.  Sets the @code{Voice.horizontalNoteShift}
+    property.
+
+  @item @code{\slurboth}
+@cindex slurboth@@@code{\slurboth}
+ @* 
+    Allow slurs to be above or below notes.  This sets the
+    @code{Voice.slurVerticalDirection} property.
+
+  @item @code{\slurdown}
+@cindex slurdown@@@code{\slurdown}
+ @* 
+    Force slurs to be below notes.  This sets the
+    @code{Voice.slurVerticalDirection} property.
+
+  @item @code{\slurup}
+@cindex slurup@@@code{\slurup}
+ @* 
+    Force slurs to be above notes.  This sets the
+    @code{Voice.slurVerticalDirection} property.
+
+  @item @code{\specialkey}
+@cindex specialkey@@@code{\specialkey}
+ @* 
+    Allow key signatures do differ in different octaves.  This sets
+    the @code{Staff.keyoctaviation} property.
+
+  @item @code{\stemboth}
+@cindex stemboth@@@code{\stemboth}
+ @* 
+    Allow stems, beams, and slurs to point either upwards or
+    downwards, decided automatically by LilyPond.  This sets the
+    @code{Voice.verticalDirection} property.
+
+  @item @code{\stemdown}
+@cindex stemdown@@@code{\stemdown}
+ @* 
+    Force stems, beams, and slurs to point down.  This sets the
+    @code{Voice.verticalDirection} property.
+
+  @item @code{\stemup}
+@cindex stemup@@@code{\stemup}
+ @* 
+    Force stems, beams and slurs to point up.  This sets the
+    @code{Voice.verticalDirection} property.
+
+  @item @code{\traditional}
+@cindex traditional@@@code{\traditional}
+ @* 
+    Used for setting the @code{Score.beamquantisation} property.  Is
+    equal to 2.
+
+  @item @code{\up}
+@cindex up@@@code{\up}
+ @* 
+    Used for setting various direction properties.  Is equal
+    to 1.
+@end table
+
+
+
+@node Running LilyPond, Top, ident, LilyPond 1-2-0 Reference Manual
+@section Running LilyPond
+
+@cindex running LilyPond
+
+
+When invoked with a filename that has no extension, LilyPond will try
+adding `@file{.ly}' as an extension first, then `@file{.fly}' and
+finally `@file{.sly}' extension.  If the filename ends with
+`@file{.fly}', LilyPond processes the file as music using
+`@file{init.fly}'.  In this case, LilyPond does something like:
+
+@quotation
+
+@example 
+\score @{
+  \notes\relative c @{
+    \input "yourfile.fly"
+  @}
+  \paper@{@}
+  \midi@{@}
+@} 
+@end example 
+
+@end quotation
+
+The result of `@file{.sly}' is similar except that a single unjustified
+line is produced.
+
+If you invoke LilyPond with a file `@file{foo.}' that doesn't
+have the `@file{.ly}' extension, then LilyPond will look for a file
+called `@file{init.}' and process this file.  The file
+`@file{init.}' must contain the @code{\maininput} keyword or
+LilyPond will not read the user specified file.
+
+When LilyPond processes @file{filename.ly} it will produce
+@file{filename.tex} as output.  If @file{filename.ly} contains a second
+@code{\paper} keyword, then LilyPond will produce @file{filename-1.tex}
+as well.  Subsequent @code{\paper} keywords will produce sequentially
+numbered file names.  Several files can be specified; they will each
+be processed independently.@footnote{Not entirely true: The status of
+GUILE is kept.}
+
+
+
+@bye
diff --git a/Documentation/tex/regression-test.tely b/Documentation/tex/regression-test.tely
new file mode 100644 (file)
index 0000000..9f9d06b
--- /dev/null
@@ -0,0 +1,294 @@
+\input texinfo @c -*-texinfo-*-   vim:tw=72
+@setfilename regression-test.info
+@settitle LilyPond Regression test
+
+@node Top, , , 
+
+This document tries give an brief overview of LilyPond features.  When
+the text correspond with the shown notation, we consider LilyPond
+Officially BugFree (tm).  This document is intended for finding bugs,
+and documenting bugfixes.
+
+@section Notes and rests
+
+Rests.  Note that the dot of 8th, 16th and 32nd rests rest should be
+next to the top of the rest.  All rests except the whole rest are
+centered on the middle staff line.  
+
+@mudelafile{rest.fly}
+
+Note head shapes are settable.  The stem endings should be adjusted
+per note head.  If you want different note head styles on one stem,
+you must create a special context called Thread.
+
+@mudelafile{noteheadstyle.ly}
+
+Noteheads can have dots, and ---although this is bad style in duple
+meters--- rests can too.  Augmentation dots should never be printed on
+a staff line, but rather be shifted vertically. They should go up, but
+in case of multiple parts, the down stems have down shifted dots.
+(Wanske p. 186) In case of chords, all dots should be in a column.
+The dots go along as rests are shifted to avoid collisions.
+
+@mudelafile{dots.fly}
+
+Multiple measure rests do not collide with barlines and clefs.  They
+are not expanded when you set \verb+Score.SkipBars+.  Although the
+multi-measure-rest is a Spanner, minimum distances are set to keep it
+colliding from barlines. 
+
+@mudelafile{multi-measure-rest.ly}
+
+@section Stems
+
+Stem tremolos (official naming?) or rolls are tremolo signs that look
+like beam segments crossing stems.  If the stem is in a beam, the
+tremolo must be parallel to the beam.  If the stem is invisible
+(eg. on a whole note), the tremolo must be centered on the note.
+
+@mudelafile{stem-tremolo.ly}
+
+Chord tremolos look like beams, but are a kind of repeat symbol.
+To avoid confusion, chord tremolo beams do not reach the stems, but 
+leave a gap.  Chord tremolo beams on half notes are not ambiguous,
+as half notes cannot appear in a regular beam, and should reach the 
+stems.
+  
+@mudelafile{chord-tremolo.sly}
+
+Beams, stems and noteheads often have communication troubles, since
+the two systems for y dimensions (1 unit = staffspace, 1 unit = 1
+point) are mixed.
+
+Stems, beams, ties and slurs should behave similarly, when placed
+on the middle staff line. Of course stem-direction is down for high
+notes, and up for low notes.
+
+@mudelafile{stem-direction.sly}
+
+Similarly, if \verb+stem_default_neutral_direction+ is set to \verb+-1+.
+
+@mudelafile{stem-direction-down.ly}
+
+@section Scripts
+
+The staccato dot (and all scripts with follow-into-staff set), must
+not be on staff lines.
+
+@mudelafile{staccato-pos.sly}
+
+@section Grace notes
+
+Grace notes are typeset as an encapsulated piece of music. You can
+have beams, notes, chords, stems etc. within a \verb|\grace| section.
+Slurs that start within a grace section, but aren't ended are attached
+to the next normal note.  Grace notes have zero duration.  If there
+are tuplets, the grace notes won't be under the brace.  Grace notes
+can have accidentals, but they are (currently) spaced at a fixed
+distance.  Grace notes (of course) come before the accidentals of the
+main note.  Grace notes can also be positioned after the main note.
+
+@mudelafile{grace.ly}
+
+
+@section Beams, slurs and other spanners
+
+Beaming is generated automatically. Beams may cross bar lines. In that
+case, line breaks are forbidden.  Yet clef and key signatures are
+hidden just as with breakable bar lines.
+
+@mudelafile{beaming.ly}
+
+Beams should behave reasonably well, even under extreme circumstances.
+Stems may be short, but noteheads should never touch the beam.
+
+@mudelafile{beam-extreme.ly}
+
+Beams should always reach the middle staff line, the second beam
+counting from the note head side, should never be lower than the
+second staff line.  This does not hold for grace note beams.
+
+@mudelafile{beam-position.sly}
+
+Slurs should look nice and symmetric.  The curvature may increase
+only to avoid noteheads, and as little as possible.
+
+@mudelafile{slur-symmetry.ly}
+@mudelafile{slur-symmetry-1.ly}
+
+Ties are strictly horizontal.  They are placed in between note heads.
+The horizontal middle should not overlap with a staffline.
+
+@mudelafile{tie.ly}
+
+Beams can be typeset over fixed distance aligned staffs, beam
+beautification doesn't really work, but knees do. Beams should be
+behave well, wherever the switching point is.
+
+@mudelafile{beam-interstaff.ly}
+
+The same goes for slurs. They behave decently when broken across
+linebreak.
+
+@mudelafile{slur-interstaff.ly}
+
+Tuplets are indicated by a bracket with a number.  There should be no
+bracket if there is one beam that matches  the length of the tuplet.
+The bracket does not interfere with the stafflines, and the number is
+centered in the gap in the bracket.
+
+@mudelafile{tup.ly}
+
+@section Repeats
+
+LilyPond has three modes for repeats: folded, unfolded and
+semi-unfolded.  Unfolded repeats are fully written out. Semi unfolded
+repeats have the body written and all alternatives sequentially.
+Folded repeats have the body written and all alternatives
+simultaneously.  If the number of alternatives is larger than the
+repeat count, the excess alternatives are ignored.  If the number of
+alternatives is smaller, the first alternative is multiplied to get to
+the number of repeats.
+
+Unfolded behavior:
+
+@mudelafile{repeat-unfold.ly}
+
+Semi (un)folded behavior.  Voltas can start on non-barline moments.
+If they don't barlines should still be shown.
+
+@mudelafile{repeat-semifold.ly}
+
+Folded.  This doesn't make sense without alternatives, but it works.
+
+@mudelafile{repeat-fold.ly}
+
+@section Lyrics
+
+Lyrics can be set to a melody automatically.  Excess lyrics will be
+dumped.  Lyrics will not be set over rests.  You can have melismata
+either by setting a property melismaBusy, or by setting
+automaticMelismas (which will set melismas during slurs and ties).  If
+you want a different order than first Music, then Lyrics, you must
+precook a chord of staffs/lyrics and label those.  Of course
+@code{\rhythm} ignores any other rhythms in the piece.  Hyphens and
+extenders do not assume anything about lyric lengths, so they continue
+to work.
+
+@mudelafile{lyric-combine.ly}
+
+@section Multiple notes
+
+Rests should not collide with beams, stems and noteheads.  Rests may
+be under beams.  Rests should be move by integral number of spaces
+inside the staff, and by half spaces outside.  Notice that the half
+and whole rests just outside the staff get ledger lines in different
+cases.
+
+@mudelafile{rest-collision.ly}
+
+Normal collisions. We have support for polyphony, where the
+middle voices are horizontally shifted.
+
+@mudelafile{collisions.ly}
+
+The number of stafflines of a staff can be set with the property
+numberOfStaffLines.  Ledger lines both on note heads and rests are
+adjusted.  Barlines also are adjusted.
+
+
+@mudelafile{number-staff-lines.fly}
+
+@section Spacing
+
+In a limited number of cases, LilyPond corrects for optical spacing
+effects.  In this example, space for opposite pointed stems is adjusted
+
+@mudelafile{stem-spacing.sly}
+
+If there are accidentals in the music, we add space, but the space
+between note and accidentals is less than between the notes with the
+same value.  Clef changes also get extra space, but not as much as
+barlines.
+
+
+Even if a line is very tightly spaced, there will still be room
+between prefatory matter and the following notes.  The space after the
+prefatory is very rigid.  In contrast, the space before the barline
+must stretch like the space within the measure.
+
+Tight:
+
+@mudelafile{spacing-tight.ly}
+
+Natural:
+
+@mudelafile{spacing-natural.ly}
+
+Loose:
+
+@mudelafile{spacing-loose.ly}
+
+
+@section Global stuff
+
+Markings that are attached to (invisible) barlines are 
+delicate: the are attached to the rest of the score without the score
+knowing it.  Consequently, they fall over  often.
+
+@mudelafile{bar-scripts.ly}
+
+Staff margins are also markings attached to barlines.  They should be
+left of the staff, and be centered vertically wrt the staff.  They may
+be on normal staffs, but also on compound staffs, like the PianoStaff
+
+@mudelafile{staff-margin.ly}
+
+Breathing signs, also used for phrasing, do normally not influence
+global spacing -- only if space gets tight, notes are shifted to make
+room for the breathing sign. Breathing signs break beams running
+through their voice. In the following example, the notes in the first
+two measures all have the same distance from each other:
+
+@mudelafile{breathing-sign.ly}
+
+Fonts are  available in a default set of sizes: 11, 13, 16, 20, 23 and
+26pt staffheight.  Sizes of the text fonts and symbol fonts are made
+to match the staff dimensions.    
+
+@mudelafile[nofly]{size11.ly}
+
+@mudelafile[nofly]{size13.ly}
+
+@mudelafile[nofly]{size16.ly}
+
+@mudelafile[nofly]{size20.ly}
+
+@mudelafile[nofly]{size23.ly}
+
+@mudelafile[nofly]{size26.ly}
+
+
+@section Clefs and Time Signatures
+
+The transparent clef should not occupy any space and with style
+@code{fullSizeChanges}, the changing clef should be typeset in full
+size. For octaviated clefs, the ``8'' should appear closely above or
+below the clef respectively.  The ``8'' is processed in a convoluted
+way, so this is fragile as well.
+
+@mudelafile{clefs.ly}
+
+@ignore
+@c the input file is too long and does not test for specific bugs
+By default, time signatures are written with two numbers. With style
+``C'', 4/4 and 2/2 are written with their corresponding symbols and
+with style ``old'', 2/2, 3/2, 2/4, 3/4, 4/4, 6/4, 9/4, 4/8, 6/8 and
+9/8 are typeset with symbols, all other signatures retain the default
+layout. The style ``1'', gives single number signatures for all
+signatures. 
+%
+\mu delafile{time.fly}
+@end ignore
+
+@bye
diff --git a/Documentation/tex/tutorial.tely b/Documentation/tex/tutorial.tely
new file mode 100644 (file)
index 0000000..23ad4c3
--- /dev/null
@@ -0,0 +1,933 @@
+\\input texinfo @c -*-texinfo-*-
+@setfilename tutorial.info
+@settitle Typesetting music with LilyPond
+
+
+@ifinfo
+
+This is a short tutorial to show you how  LilyPond works.  It is not a
+tutorial.  It was written by Han-Wen Nienhuys.
+
+Copyright 1999 by its authors.
+@end ifinfo
+
+@titlepage
+@sp 10
+@comment The title is printed in a large font.
+@center @titlefont{LilyPond tutorial}
+@vskip 20pt
+@center @titlefont{Han-Wen Nienhuys}
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1999 by its author(s)
+@end titlepage
+
+
+@node Top, , The end, (dir)
+@top
+@menu
+* Typesetting music with LilyPond::Typesetting music with LilyPond
+@end menu
+
+
+
+
+
+
+
+
+
+
+
+
+@node Typesetting music with LilyPond, Introduction, , Top
+@menu
+* Introduction::                  Introduction
+* tutorial-introduction::         tutorial-introduction
+* The first tune::                The first tune
+* sec-firsttune::                 sec-firsttune
+* Lyrics and chords::             Lyrics and chords
+* Piano music::                   Piano music
+* The end::                       The end
+@end menu
+@chapter Typesetting music with LilyPond
+
+
+
+
+
+
+@node Introduction, tutorial-introduction, Typesetting music with LilyPond, Typesetting music with LilyPond
+@section Introduction
+@node tutorial-introduction, The first tune, Introduction, Typesetting music with LilyPond
+
+  
+LilyPond prints music from a specification that you, the user, supply.
+You have to give that specification using a @emph{language}.  This
+document is a gentle introduction to that language, which is called
+Mudela, an acronym of Music Definition Language.
+
+This tutorial will demonstrate how to use Mudela by presenting
+examples of input along with resulting output.  We will use English
+terms for notation.  In case you are not familiar with those, you may
+consult the glossary that is distributed with LilyPond.
+
+The examples discussed are included in the distribution, in the
+subdirectory @file{input/tutorial/}.  It is recommended that you
+experiment with writing Mudela input yourself, to get a feel for
+how LilyPond behaves.
+
+@node The first tune, sec-firsttune, tutorial-introduction, Typesetting music with LilyPond
+@section The first tune
+@node sec-firsttune, Lyrics and chords, The first tune, Typesetting music with LilyPond
+
+To demonstrate what LilyPond input looks like, we start off with a
+full fledged, yet simple example. It is a convoluted version
+of the famous menuet in J. S. Bach's @emph{Klavierbuechlein}.
+
+@mudela[verbatim]
+% lines preceded by a percent are comments.
+\include "paper16.ly"
+\score {
+    \notes                        
+    \relative c'' \sequential{                
+            \time 3/4;                
+            \key g;
+
+        \repeat "volta" 2 {
+            d4 g,8 a b c d4 g, g |
+            e'4 c8 d e fis g4 g, g |
+            c4 d8()c b a( )b4 c8 b a g |
+            a4 [b8 a] [g fis] g2.  |
+        }
+
+        b'4 g8 a b g
+        a4 d,8 e fis d |
+        g4 e8 fis g d cis4 b8 cis a4 |
+        a8-. b-. cis-. d-. e-. fis-.
+        g4 fis e |
+        fis a,  r8 cis8
+        d2.-\fermata
+        \bar "|.";
+    }
+    \paper {
+       % standard settings are too wide for a book
+       linewidth = 14.0 \cm;
+   }
+}
+@end mudela
+
+Enter it (or copy it, the filename is @file{menuet.ly}), compile it
+with LilyPond and view the output.  Details of this procedure may vary
+from system to system.  To create the output, one would issue the
+command `@code{ly2dvi menuet}'.  @file{ly2dvi} is a program that does
+the job of running LilyPond and TeX, handling of titles and
+adjusting of page margins.
+
+If all goes well, the file @file{menuet.dvi} will be created.
+To view this output, issue the command `@code{xdvi menuet}'.
+
+Now that we are familiar with the procedure of producing output, we
+will analyse the input, line by line.@example 
+
+        % lines preceded by a percent are comments.
+@end example 
+The percent sign, `@code{%}', introduces a line comment.  If you want to
+make larger comments, you can use block comments. These are delimited
+by `@code{%@{}' and `@code{%@}}'@example 
+
+        \input "paper16.ly"
+@end example 
+By default, LilyPond will use definitions for a 20
+point@footnote{A point is the standard measure of length for
+printing.  One point is 1/72.27 inch.} high staff.  We want smaller
+output (16 point staff height), so we must import the settings for
+that size, which is done.@example 
+
+        \score @{
+@end example 
+  A mudela file combines music with directions for outputting that
+music.  The music is combined with the output directions by putting
+them into a @code{\score} block.
+@example 
+
+        \notes                
+@end example 
+ This makes LilyPond ready for accepting notes.
+@example 
+
+        \relative c''
+@end example 
+ As we will see, pitches are combinations of octave, note name and
+chromatic alteration.  In this scheme, the octave is indicated by
+using raised quotes (`@code{'}') and ``lowered'' quotes (commas:
+`@code{,}').  The central C is denoted by @code{c'}.  The C one octave
+higher is @code{c''}.  One and two octaves below the central C is
+denoted by @code{c} and @code{c,} respectively.
+
+For pitches in a long piece you might have to type many quotes.  To
+remedy this, LilyPond has a ``relative'' octave entry mode.  In this
+mode, octaves of notes without quotes are chosen such that a note is
+as close as possible (graphically, on the staff) to the the preceding
+note.  If you add a high-quote an extra octave is added.  The lowered
+quote (a comma) will subtract an extra octave.  Because the first note
+has no predecessor, you have to give the (absolute) pitch of the note
+to start with.@example 
+
+        \sequential @{
+@end example 
+  What follows is sequential music, i.e.,
+notes that are to be played and printed after each other.@example 
+
+        \time 3/4;
+@end example 
+  This command changes the time signature of the current piece: a 3/4
+sign is printed.  This command is also used to generate bar lines in
+the right spots.@example 
+
+        \key g;
+@end example 
+ This command changes the current key to G-major.  Although this
+command comes after the @code{\time} command, in the output, the key
+signature comes before the time signature: LilyPond knows about music
+typesetting conventions. @example 
+
+        \repeat "volta" 2
+@end example 
+  This command tells LilyPond that the following piece of music must
+be played twice; @code{"volta"} volta brackets should be used for
+alternatives---if there were any.
+@example 
+
+        @{
+@end example 
+The subject of the repeat is again sequential music.  Since
+@code{\sequential} is such a common construct, a shorthand is provided:
+just leave off @code{\sequential}, and the result is the same. @example 
+
+        d4
+@end example 
+ This is a note with pitch @code{d} (determined up to octaves).  The
+relative music was started with a @code{c''}, so the real pitch of this
+note is @code{d''}.  The @code{4} designates the duration of the note
+(it is a quarter note). @example 
+
+        a b
+@end example 
+These are notes with pitch @code{a} and @code{b}.  Because their
+duration is the same as the @code{g}, there is no need to enter the
+duration (You may enter it anyway, eg. @code{a4 b4}) @example 
+
+        d4 g, g |
+@end example 
+ Three more notes.  The `@code{|}' character is a `barcheck'.  When
+processing the music, LilyPond will verify that barchecks are found at
+the start of a measure.  This can help you track down errors.
+
+ So far, no notes were chromatically altered.  Here is the first one
+that is: @code{fis}. Mudela by default uses Dutch note names, and
+``Fis'' is the Dutch note name for ``F sharp''.  However, there is no
+sharp sign in the output. The program keeps track of key signatures,
+and will only print accidentals if they are needed.
+@example 
+
+        c8 d e fis
+@end example 
+LilyPond guesses were beams can be added to eighth and shorter notes.
+In this case, a beam over 4 eighths is added.
+@example 
+
+        c4 d8( )c b a( )b4 c8 b a g |
+@end example 
+  The next line shows how to make a slur:
+the beginning and ending note of the slur is marked with an opening and
+closing parenthesis respectively.  In the line shown above this is
+done for two slurs.  Slur markers (parentheses) are between
+the notes.@example 
+
+        a4 [b8 a] [g fis] 
+@end example 
+Automatic beaming can be overridden by inserting beam marks
+(brackets).  Brackets are put around notes you want beamed.@example 
+
+        g2.  |
+@end example 
+A duration with augmentation dot  is notated
+with the duration number followed by a period.@example 
+
+        @}
+@end example 
+  This ends the sequential music to be repeated.  LilyPond will typeset
+a repeat bar.  @example 
+
+        cis'4 b8 cis a4 |
+@end example 
+ This line shows that Lily will print an accidental if that is
+needed: the first C sharp will be printed with an accidental, the
+second one without.  @example 
+
+        a8-. b-. cis-. d-. e-. fis-.
+@end example 
+You can enter articulation signs either in a verbose form using a
+shorthand.  Here we demonstrate the shorthand: it is formed by a dash
+and the the character for the articulation to use, e.g. `@code{-.}' for
+staccato as shown above.  @example 
+
+        fis a, r8 cis8
+@end example 
+Rests are denoted by the special notename `@code{r}'.  You can also enter
+an invisible rest by using the special notename `@code{s}'.
+@example 
+
+        d2.-\fermata
+@end example 
+ All articulations have a verbose form, like @code{\fermata}.  The
+command `@code{\fermata}' is not part of the core of the language (most
+of the other discussed elements are), but it is a shorthand for a more
+complicated description of a fermata.  @code{\fermata} names that
+description and is therefore called an @emph{identifier}. @example 
+
+        @}
+@end example 
+Here the music ends.
+@example 
+
+        \paper @{
+                linewidth = 14.0\cm;
+        @}
+@end example 
+This specifies a conversion from music to notation output.  Most of
+the details of this conversions (font sizes, dimensions, etc.) have
+been taken care of, but  to fit the output  in this document, it has
+to be smaller.  We do this by setting the line width to 14 centimeters
+(approximately 6 inches).
+@example 
+
+        @}
+@end example 
+The last brace ends the @code{\score} block.
+
+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.  Therefore 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'.
+
+@node Lyrics and chords, Piano music, sec-firsttune, Typesetting music with LilyPond
+@section Lyrics and chords
+
+In this section we show how to typeset a song of unknown
+origin.@footnote{The author would welcome information about the origin
+of this song.}.
+
+@example 
+\header @{
+        title = "The river is flowing";
+        composer = "Traditional (?)";
+@}
+\include "paper16.ly"
+melody = \notes \relative c' @{
+        \partial 8;
+        g8 |
+        c4 c8 d [es () d] c4 | f4 f8 g [es() d] c g |
+        c4 c8 d [es () d] c4 | d4 es8 d c4.
+        \bar "|.";
+@}
+
+text = \lyrics @{
+        The ri -- ver is flo- __ wing, flo -- wing and gro -- wing, the
+        ri -- ver is flo -- wing down to the sea.
+@}
+
+accompaniment =\chords @{
+        r8
+        c2-3- f-3-.7 d-min es4 c8-min r8
+        c2-min f-min7 g-7^3.5 c-min @}
+
+\score @{
+        \simultaneous @{
+%         \accompaniment
+          \context ChordNames \accompaniment
+
+          \addlyrics
+            \context Staff = mel @{        
+              \property Staff.noAutoBeaming = "1"
+              \property Staff.automaticMelismata = "1"
+              \melody 
+            @}
+            \context Lyrics \text
+        @}
+        \midi  @{ @}
+        \paper @{ linewidth = 10.0\cm; @}
+@} 
+@end example 
+
+
+The result would look this@footnote{The titling and font size shown
+may differ, since the titling in this document is not generated by
+@file{ly2dvi}.}.
+
+@center @strong{The river is flowing}
+@center Traditional 
+
+@mudela[center]
+\header {
+        title = "The river is flowing";
+        composer = "Traditional (?)";
+}
+\include "paper16.ly"
+melody = \notes \relative c' {
+        \partial 8;
+        g8 |
+        c4 c8 d [es () d] c4 | f4 f8 g [es() d] c g |
+        c4 c8 d [es () d] c4 | d4 es8 d c4.
+        \bar "|.";
+}
+
+text = \lyrics {
+        The ri -- ver is flo- __ wing, flo -- wing and gro -- wing, the
+        ri -- ver is flo -- wing down to the sea.
+}
+
+accompaniment =\chords {
+        r8
+        c2-3- f-3-.7 d-min es4 c8-min r8
+        c2-min f-min7 g-7^3.5 c-min }
+
+\score {
+        \simultaneous {
+%         \accompaniment
+          \context ChordNames \accompaniment
+
+          \addlyrics
+            \context Staff = mel {
+              \property Staff.noAutoBeaming = "1"
+              \property Staff.automaticMelismata = "1"
+              \melody 
+            }
+            \context Lyrics \text
+        }
+        \midi  { }
+        \paper { linewidth = 10.0\cm; }
+}
+@end mudela
+
+Again, we will dissect the file line by line.@example 
+
+        \header @{
+@end example 
+Information about the music you are about to typeset goes into a
+@code{\header} block.  The information in this block is not used by
+LilyPond, but it is included in the output.  @file{ly2dvi} uses this
+information to print titles above the music.
+@example 
+
+        title = "The river is flowing";
+        composer = "Traditional (?)"; 
+@end example 
+the @code{\header} block contains assignments.  An assignment starts
+with a string.  (which is unquoted, in this case). Then comes the
+equal sign `@code{=}'.  After the equal sign comes the expression you
+want to store.  In this case, you want to put in strings.  The
+information has to be quoted here, because it contains spaces. The
+assignment is finished with a semicolon.@example 
+
+        \include "paper16.ly"
+@end example 
+Smaller size for inclusion in a book.@example 
+
+        melody = \notes \relative c' @{
+@end example 
+The structure of the file will be the same as the previous one, a
+@code{\score} block with music in it.  To keep things readable, we will
+give names to the different parts of music, and use the names to
+construct the music within the score block.
+
+@example 
+
+        \partial 8;
+@end example 
+
+The piece starts with an anacrusis of one eighth.  @example 
+
+        c4 c8 d [es () d] c4 | f4 f8 g [es() d] c g |
+        c4 c8 d [es () d] c4 | d4 es8 d c4.
+        \bar "|.";
+@end example 
+We use explicit beaming.  Since this is a song,  we will turn automatic
+beams off, and use explicit beaming where needed.@example 
+
+        @}
+@end example 
+This ends the definition of @code{melody}.  Note that there are no
+semicolons after assignments at top level.@example 
+
+        text = \lyrics @{
+@end example 
+Another identifier assignment.  This one is for the lyrics. 
+Lyrics are formed by syllables that have duration, and not by
+notes. To make LilyPond parse words as syllables,  switch it  into
+lyrics mode with @code{\lyrics}.  Again, the brace after @code{\lyrics}
+is a shorthand for @code{\sequential @{}. @example 
+
+        The4 ri -- ver is flo- __ wing,  flo -- wing and gro -- wing, the
+        ri- ver is flo- __ wing down to the sea.
+        @}
+@end example 
+The syllables  themselves are  separated by spaces.  You can get syllable
+extenders by entering `@code{__}', and centered hyphens with
+`@code{-}@code{-}'.  We enter the syllables as if they are all quarter notes
+in length (hence the @code{4}), and use a feature to align the
+syllables to the music (which obviously isn't all quarter notes.)
+@example 
+
+        accompaniment =\chords @{
+@end example 
+We'll put chords over the music.  There is a special mode (analogous
+to @code{\lyrics} and @code{\notes} mode) where you can give the names
+of the chords you want, instead of the notes comprising the chord.
+@example 
+
+        r8
+@end example 
+There is no accompaniment during the anacrusis.@example 
+
+        c2-3- f-3-.7
+@end example 
+A chord is started by  the tonic of the chord. The
+first one lasts a half note.  An unadorned note creates a major
+triad, while a minor triad is wanted.  @code{3-} modifies the third to
+be small. @code{7} modifies (adds) a seventh, which is small by default
+to create the @code{f a c es} chord.  Multiple modifiers must be
+separated by a dot.@example 
+
+        d-min es4 c8-min r8
+@end example 
+Some modifiers have predefined names, eg. @code{min} is  the same as
+@code{3-}, so @code{d-min} is a minor @code{d} chord.@example 
+
+        c2-min f-min7 g-7^3.5 c-min @}
+@end example 
+A named modifier @code{min} and a normal modifier @code{7} do not have
+to be separated by a dot.  Tones from a chord are removed with chord
+subtractions.  Subtractions are started with a caret, and they are
+also separated by dots.  In this example, @code{g-7^3.5} produces a
+minor seventh.  The brace ends the sequential music. @example 
+
+        \score @{
+                \simultaneous @{
+@end example 
+We assemble the music in the @code{\score} block.  Melody, lyrics and
+accompaniment have to sound at the same time, so they should be
+@code{\simultaneous}.@example 
+
+        %\accompaniment
+@end example 
+Chord mode generates notes grouped in @code{\simultaneous} music.  If
+you remove the comment sign, you can see the chords in normal
+notation: they will be printed as note heads on a separate
+staff. @example 
+
+        \context ChordNames \accompaniment
+@end example 
+Normally, the notes that you enter are transformed into note heads.
+The note heads alone make no sense, they need surrounding information:
+a key signature, a clef, staff lines, etc.  They need @emph{context}.  In
+LilyPond, these symbols are created by objects called `interpretation
+context'.  Interpretation contexts only exist during a run of
+LilyPond.  Interpretation contexts that are for printing music (as
+opposed to playing music) are called `notation context'.
+
+By default, LilyPond will create a Staff contexts for you.  If you
+would remove the @code{%} sign in the previous line, you can see that
+mechanism in action.
+
+We don't want default contexts here, because we want names, not note
+heads.  An interpretation context can also created upon explicit
+request. The keyword for such a request is @code{\context}.  It takes
+two arguments.  The first is the name of a interpretation context.
+The name is a string, it can be quoted with double quotes).  The
+second argument is the music that should be interpreted in this
+context.  For the previous line, we could have written @code{\context
+Staff \accompaniment}, and get the same effect.@example 
+
+        \addlyrics
+@end example 
+The lyrics need to be aligned with the melody.  This is done by
+combining both with @code{\addlyrics}.  @code{\addlyrics} takes two
+pieces of music (usually a melody and lyrics, in that order) and
+aligns the syllables of the second piece under the notes of the
+first piece.  If you would reverse the order, the notes would be
+aligned on the lyrics, which is not very useful. (Besides, it looks
+silly.)@example 
+
+        \context Staff = mel @{
+@end example 
+This is the argument of @code{\addlyrics}.  We instantiate a
+@code{Staff} context explicitly: should you chose to remove comment
+before the ``note heads'' version of the accompaniment, the
+accompaniment will be on a nameless staff.  The melody has to be on a
+different staff as the accompaniment.  This is accomplished by giving
+the melody staff a different name.@example 
+
+        \property Staff.noAutoBeaming = "1"
+@end example 
+An interpretation context has variables that tune its behaviour.  One
+of the variables is @code{noAutoBeaming}.  If set and non-zero (i.e.,
+true) LilyPond will not try to put automatic beaming on the current
+staff.@example 
+
+        \property Staff.automaticMelismata = "1"
+@end example 
+Similarly, we  don't want to print a  syllable when there is
+a slur. This sets up the Staff context to signal slurs while
+@code{\addlyrics} is processed. @example 
+
+          \melody
+        @}
+@end example 
+Finally, we put the melody on the current staff.  Note that the
+@code{\property} directives and @code{\melody} are grouped in sequential
+music,  so the property settings are done before the melody is
+processed.  @example 
+
+        \context Lyrics \text
+@end example 
+The second argument of @code{\addlyrics} is the text. The text also
+should not land on a Staff, but on a interpretation context for
+syllables, extenders, hyphens etc.  This context is called
+Lyrics.@example 
+
+        @}
+@end example 
+This ends @code{\simultaneous}.@example 
+
+        \midi  @{ @}
+@end example 
+This makes the music go to a MIDI file.  MIDI is great for
+checking music you enter.  You listen to the MIDI file: if you hear
+something unexpected, it's probably a typing error.  @code{\midi} is an
+`output definition', a declaration that specifies how to output music
+analogous to @code{\paper @{ @}}.@example 
+
+        \paper @{ linewidth = 10.0\cm; @}
+@end example 
+We also want notation output.  The linewidth is short so the piece
+will be set in two lines. @example 
+
+        @}
+@end example 
+End the score block.
+
+@node Piano music, The end, Lyrics and chords, Typesetting music with LilyPond
+@section Piano music
+
+Our third subject is a piece piano music.  The fragment in the input
+file is a piano reduction of the G major Sinfonia by Giovanni Battista
+Sammartini.  It was composed around 1740. 
+
+@mudela[verbatim]
+
+\include "paper16.ly";
+
+viola = \notes \relative c' \context Voice = viola {
+        <c4-\f g' c>
+        \property Voice.verticalDirection = \down g'8. b,16
+        s1 s2. r4
+        g
+}
+
+oboes = \notes \relative c'' \context Voice = oboe {
+        \stemup s4  g8. b,16 c8 r <e'8.-\p g> <f16 a>
+        \grace <e8( g> <d4 f> <c2 e> \times 2/3 { <d8 \< f> <e g> <f a> }
+        <
+          { \times 2/3 { a8 g c } \! c2 }
+          \context Voice = oboeTwo {
+                \stemdown
+                \grace {
+                    \property Grace.verticalDirection = \down
+                    [f,16 g] }
+                f8 e e2
+        } >
+        \stemboth
+        \grace <c,8( e> <)b8. d8.-\trill> <c16 e> | 
+        [<d ( f> < )f8. a>] <)b,8 d> r [<d16( f> <f8. )a>] <b,8 d> r  |
+        [<c16( e>  < )e8. g>] <c8 e,>
+}
+
+hoomPah  = \notes \transpose c' {
+    c8 \translator Staff = top \stemdown 
+    c'8 \translator Staff = bottom \stemup }
+
+hoomPahHoomPah = { [\hoomPah \hoomPah] }
+
+bassvoices = \notes \relative c' {
+        c4 g8. b,16
+        \hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah
+        \stemdown [c8 c'8] r4
+        <g d'> r4
+        < {\stemup r2 <e4 c'> <c8 g'> }
+          \context Voice = reallyLow  {\stemdown g2 ~ | g4 c8 } >
+}
+
+\score {
+        \context PianoStaff \notes <
+                \context Staff = top < \time 2/2;
+                        \context Voice = viola \viola
+                        \oboes
+                >
+                \context Staff = bottom < \time 2/2; \clef bass;
+                        \bassvoices
+                >
+        >
+        \midi { }
+        \paper {
+          indent = 0.0;
+          linewidth = 15.0 \cm; }
+}
+@end mudela
+
+If it looks like incomprehensible gibberish to you... Then you are
+right.  The author has doctored this example to have as many quirks in
+one system as possible.@example 
+viola = \notes \relative c'  \context Voice = viola @{ 
+@end example 
+In this example, you can see multiple parts on a staff.  Each part is
+associated with one notation context.  This notation context handles
+stems and dynamics (among others).  The name of this context is
+@code{Voice}.  For each part we have to make sure that there is
+precisely one Voice context@footnote{If @code{\context} would not
+have been specified explicitly, three @code{Voice} contexts would be
+created: one for each note  in the first chord.}.@example 
+<c4-\f g' c> 
+@end example 
+@code{<} and @code{>} are short hands for @code{\simultaneous @{} and
+@code{@}}. So the expression enclosed in @code{<} and @code{>} is a
+chord.  @code{\f} places a forte symbol  under the chord.@example 
+\property Voice.verticalDirection = \down 
+@end example 
+@code{verticalDirection} is a property of the voice context. It
+controls the directions of stems, articulations marks and other
+symbols.
+  If @code{verticalDirection} is set to @code{\down}
+(identifier for the integer -1) the stems go down,
+@code{\up} (identifier for the integer 1) makes the stems go up.@example 
+        g'8. b,16 
+@end example 
+Relative octaves work a little differently with chords.  The starting
+point for the note following a chord is the first note of the chord.  So
+the @code{g} gets an octave up quote: it is a fifth above the starting
+note of the previous chord (the central C).
+
+@example 
+s1 s2. r4 
+@end example 
+@code{s} is a `spacer' rest.  It does not print anything,  but it does
+have the duration of a rest.   @example 
+oboes = \notes \relative c'' \context Voice = oboe @{ 
+@end example 
+Now comes a part for two oboes.  They play homophonically, so we
+print the notes as one voice that makes chords. Again, we insure that
+these notes are indeed processed by precisely one context with
+@code{\context}.@example 
+\stemup s4  g8. b,16 c8 r <e'8.-\p g> <f16 a> 
+@end example 
+@code{\stemup} is an identifier reference.  It is shorthand for
+@code{\property Voice.verticalDirection = \up}.  If possible, you
+should use predefined identifiers like these for setting properties.
+Your input will be less dependent upon the implementation of LilyPond.
+@example 
+\grace <e8( g> < )d4 f> <c2 e> 
+@end example 
+@code{\grace} introduces grace notes.  It takes one argument, in this
+case a chord.  The slur started on the @code{e} of the chord
+will be attached to the next note.@footnote{LilyPond will squirm
+about unended Slurs.  In this case, you can ignore the warning}.
+@example 
+\times 2/3 
+@end example 
+Tuplets are made with the @code{\times} keyword.  It takes two
+arguments: a fraction and a piece of music.  The duration of the
+second argument is multiplied by the first argument.  Triplets make
+notes occupy 2/3 of their notated duration, so in this case the
+fraction is 2/3. @example 
+@{ <d8 \< f> <e g> <f a> @} 
+@end example 
+The piece of music to be `tripletted' is sequential music containing
+three notes.  On the first chord (the @code{d}), a crescendo is started
+with @code{\<}.@example 
+< 
+@end example 
+At this point, the homophonic music splits into two rhythmically
+different parts.  We can't use a sequence of chords to enter this, so
+we make a `chord' of sequences to do it.  We start with the upper
+voice, which continues with upward stems: @example 
+ @{ \times 2/3 @{ a8 g c @} \! c2 @} 
+@end example 
+The crescendo is ended at the half note by the escaped exclamation
+mark `@code{\!}'.  @example 
+\context Voice = oboeTwo @{
+\stemdown 
+@end example 
+We can't share stems with the other voice, so we have to create a new
+@code{Voice} context.  We give it the name @code{oboeTwo} to distinguish
+it from the other context.  Stems go down in this voice. @example 
+\grace @{  
+@end example 
+When a grace section is processed, a @code{Grace} context is
+created. This context acts like a miniature score of its own.  It has
+its own time bookkeeping, and you can make notes, beams, slurs
+etc. Here fiddle with a property and make a beam.  The argument of
+@code{\grace} is sequential music.@example 
+\property Grace.verticalDirection = \down
+[f,16 g] @} 
+@end example 
+Normally, grace notes are always stem up, but in this case, the upper
+voice interferes. We set the stems down here.
+
+As far as relative mode is concerned, the previous note is the
+@code{c'''2} of the upper voice, so we have to go an octave down for
+the @code{f}.
+@example 
+
+  f8 e e2
+@} > 
+@end example 
+This ends the two-part section. @example 
+\stemboth
+\grace <c,8( e> <)b8. d8.-\trill> <c16 e> |  
+@end example 
+@code{\stemboth} ends the forced stem directions. From here, stems are
+positioned as if it were single part music.
+
+The bass has a little hoom-pah melody to demonstrate parts switching
+between staffs.  Since it is repetitive, we use identifiers:@example 
+hoomPah  = \notes \transpose c' @{ 
+@end example 
+Transposing can be done with @code{\transpose}.  It takes two
+arguments; the first specifies what central C should be transposed to.
+The second is the to-be-transposed music.  As you can see, in this
+case, the transposition is a no-op.  Central C is transposed to
+central C.
+
+The purpose of this no-op is circumventing relative mode.  Relative
+mode can not be used in conjunction with transposition, so relative
+mode will leave the contents of @code{\hoomPah} alone.  We can use it
+without having to worry about getting the motive in a wrong
+octave@footnote{@code{hoomPah = \relative ...} would be more
+intuitive to use, but that would not let me plug @code{\transpose}
+:-).}.@example 
+c8 \translator Staff = top \stemdown  
+@end example 
+We assume that the first note will be put in the lower staff.  After
+that note we switch to the upper staff with @code{\translator}.  To be
+precise, this @code{\translator} entry switches the current voice to a
+@code{Staff} named @code{top}. So we have to name the upper staff
+`@code{top}'.  Stem directions are set to avoid interfering with the
+oboe voices.  @example 
+c'8 \translator Staff = bottom \stemup @} 
+@end example 
+Then a note is put on the upper staff, and we switch again.  We have
+to name the lower staff `@code{bottom}'. @example 
+hoomPahHoomPah = @{ [\hoomPah \hoomPah] @} 
+@end example 
+Put two of these fragments in sequence, and beam them.@example 
+bassvoices = \notes \relative c' @{
+c4 g8. b,16
+\hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah
+\hoomPahHoomPah 
+@end example 
+Entering the bass part is easy: the hoomPahHoomPah variable is
+referenced four times.@example 
+\context Voice = reallyLow  @{\stemdown g2 ~ | g4 c8 @} > 
+@end example 
+After skipping some lines, we see @code{~}.  This mark makes ties.@example 
+\context PianoStaff 
+@end example 
+For piano music, a special context is needed to get cross staff
+beaming right.  It is called @code{PianoStaff}.@example 
+\context Staff = bottom < \time 2/2; \clef bass; 
+@end example 
+The bottom staff must have a different clef.@example 
+indent = 0.0; 
+@end example 
+To make some more room on the line, the first (in this case the only)
+line is not indented.  The line still looks is very cramped, but that is due
+to the format of this tutorial.
+
+This example shows a lot of features, but the organisation isn't
+perfect.  For example, it would be less confusing to use a chord
+containing sequential music than a sequence of chords for the oboe
+parts.
+
+[TODO: demonstrate Hara-Kiri with scores and  part extraction.]
+
+@node The end, Top, Piano music, Typesetting music with LilyPond
+@section The end        
+         
+That's all folks.  From here, you can either try fiddling with input
+files, or you can read the reference manual.
+
+
+@bye
diff --git a/Documentation/topdocs/INSTALL.texi b/Documentation/topdocs/INSTALL.texi
new file mode 100644 (file)
index 0000000..c246ff1
--- /dev/null
@@ -0,0 +1,406 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename INSTALL.info
+@settitle INSTALL - compiling and installing GNU LilyPond
+
+@node Top, , AUTHORS, (dir)
+@top
+@menu
+* INSTALL - compiling and installing GNU LilyPond::INSTALL - compiling and installing GNU LilyPond
+@end menu
+
+
+@node INSTALL - compiling and installing GNU LilyPond, abstract, , Top
+@menu
+* abstract::                      abstract
+* obtaining::                     obtaining
+* PREREQUISITES::                 PREREQUISITES
+* running::                       running
+* WEBSITE::                       WEBSITE
+* CONFIGURING and COMPILING::     CONFIGURING and COMPILING
+* CONFIGURING FOR MULTIPLE PLATFORMS::CONFIGURING FOR MULTIPLE PLATFORMS
+* INSTALLING::                    INSTALLING
+* REDHAT LINUX::                  REDHAT LINUX
+* DEBIAN GNU/LINUX::              DEBIAN GNU/LINUX
+* WINDOWS NT/95::                 WINDOWS NT/95
+* w32::                           w32
+* BUGS::                          BUGS
+* AUTHORS::                       AUTHORS
+@end menu
+@chapter INSTALL - compiling and installing GNU LilyPond
+
+
+@node abstract, obtaining, INSTALL - compiling and installing GNU LilyPond, INSTALL - compiling and installing GNU LilyPond
+@section abstract
+
+TODO: document xdeltas
+
+This document explains what you need to install LilyPond, and what you
+should do.  If you are going to compile and install LilyPond often,
+e.g. when doing development, you might want to check out the 
+@file{buildscripts/set-lily.sh} script.  It sets some environment 
+variables and symlinks, which comes in handly when you have to compile 
+LilyPond more often.  
+
+@node obtaining, PREREQUISITES, abstract, INSTALL - compiling and installing GNU LilyPond
+@section obtaining
+
+You can get the latest version of LilyPond at
+@url{ ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/}.  Refer to the links
+document for mirror sites.
+
+@emph{If you upgrade by patching do remember to rerun autoconf after
+applying the patch}.
+
+@node PREREQUISITES, running, obtaining, INSTALL - compiling and installing GNU LilyPond
+@section PREREQUISITES
+
+For compilation you need:
+
+@itemize @bullet
+@item A GNU system: GNU LilyPond is known to run on these GNU systems: Linux
+    (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix and
+Solaris.
+
+@item Lots of disk space: LilyPond takes between 30 and 100 mb to
+compile if you use debugging information.  If you are short on
+disk-space run configure with @code{--disable-debugging}.
+
+Although we recommend to use Unix, LilyPond is known to run on Windows
+NT/95/98 as well.  See Section @xref{w32}.
+
+@item  EGCS 1.1 or newer. Check out @url{ ftp://ftp.gnu.org/pub/gcc/}
+
+@item  Python 1.5,
+Check out
+@url{ftp://ftp.python.org} or @url{ftp://ftp.cwi.nl/pub/python}.
+
+@item  GUILE 1.3,  check out @url{http://www.gnu.org/software/guile/guile.html}.
+
+@item GNU make. 
+Check out @url{ftp://ftp.gnu.org/make/}.
+
+@item Flex (version 2.5.4 or newer). 
+Check out @url{ftp://ftp.gnu.org/flex/}.
+
+@item Bison (version 1.25 or newer).
+Check out @url{ftp://ftp.gnu.org/bison/}.
+
+@item Texinfo. Check out @url{ftp://ftp.gnu.org/pub/texinfo/}.
+Most documentation is in texinfo.
+
+@item Yodl.  Needed for obsolete docs (1.31.17)
+@url{ftp://ftp.lilypond.org/pub/yodl}.
+
+@item The geometry package for LaTeX is needed to use ly2dvi.  
+Available at 
+@url{ftp://ftp.ctan.org/tex-archive/macros/latex/contrib/supported/geometry}
+or at mirror site @url{ftp://ftp.dante.de}
+
+@item MetaPost, if you want to use direct PostScript output. Please
+note  that  tetex-0.4pl8 (included with Redhat 5.x) does not include
+@file{mfplain.mp}, which is needed  for producing the scaleable font files.
+
+@end itemize
+
+@node running, WEBSITE, PREREQUISITES, INSTALL - compiling and installing GNU LilyPond
+@section running
+
+GNU LilyPond does use a lot of resources. For operation you need the
+following software
+
+@itemize @bullet
+@item TeX
+@item A PostScript printer and/or viewer (such as Ghostscript) is strongly
+    recommended.  Xdvi will show all embedded PostScript too if you have
+    Ghostscript installed.
+@item  GUILE 1.3, check out @url{http://www.gnu.org/programs/guile.html}
+@end itemize
+
+For running LilyPond successfully you have to help TeX and MetaFont
+find various files.  The recommended way of doing so is adjusting the
+environment variables in the start-up scripts of your shell.  An
+example is given here for the Bourne shell:
+@example 
+export MFINPUTS="/usr/local/share/lilypond/mf:"
+export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:"
+@end example 
+
+The empty path component
+represents TeX and MetaFont's default search paths.  Scripts with
+the proper paths for the bourne and C-shell respectively are generated in
+@file{buildscripts/out/lilypond-profile} and
+@file{buildscripts/out/lilypond-login} during compilation. 
+
+LilyPond is a hiddeously big, slow and bloated program.  A fast CPU
+and plenty of RAM is recommended for comfortable use.
+
+@node WEBSITE, CONFIGURING and COMPILING, running, INSTALL - compiling and installing GNU LilyPond
+@section WEBSITE
+
+The website is the most convenient form to use for reading the
+documentation on-line documentation. It is made by entering @example 
+
+  make website
+@end example 
+This does require a fully functioning
+
+If you want to auto-generate Lily's website, you'll need some additional
+conversion tools.
+
+@itemize @bullet
+@item YODL 1.31.15 or later.
+
+@item xpmtoppm (from the Portable Bitmap Utilities) (For RedHat Linux
+            users: it is included within the package libgr-progs).
+       the original is at
+@url{ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.p1.tar.gz}
+
+@item pnmtopng, which is also in libgr-progs for RedHat. The original is
+at
+@url{ftp://swrinde.nde.swri.edu/pub/png/applications/pnmtopng-2.37.2.tar.gz}.i
+
+The version of @file{pnmtopng} that is distributed with RedHat 5.1 and
+5.2 contains a bug: pnmtopng is dynamically linked to the wrong
+version of libpng, which results in cropped images.  Recompile it from 
+source, and make sure that the pnmtopng binary is linked statically to 
+the libpng that is included in libgr.  RedHat 6.0 does not have this 
+problem.
+
+@example 
+ tar xzf libgr-2.0.13.tar.gz
+      make
+      cd png
+      rm libpng.so*
+      make pnmtopng
+@end example 
+
+You can then install the new pnmtopng into @file{/usr/local/bin/}
+
+@item Bib2html @url{http://pertsserver.cs.uiuc.edu/~hull/bib2html.}
+    Which, in turn depends on man2html for proper installation.
+man2html can be had from @url{http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Networking/WWW/Man2html-1.05}.
+
+The website will build without this utility, but you will not see our
+hypertextified bibliography.
+
+@item Doc++ (optional) to read the source code.
+
+@end itemize
+
+You also have to install @file{buildscripts/out/ps-to-gifs} in a
+directory that is in the path.
+
+@node CONFIGURING and COMPILING, CONFIGURING FOR MULTIPLE PLATFORMS, WEBSITE, INSTALL - compiling and installing GNU LilyPond
+@section CONFIGURING and COMPILING
+
+to install GNU LilyPond, simply type:
+@example 
+
+       gunzip -c lilypond-x.y.z | tar xf -
+       cd lilypond-x.y.z
+       ./configure             # fill in your standard prefix with --prefix
+       make
+       make install
+@end example 
+
+This will install a number of files, something close to:
+@example 
+
+       /usr/local/man/man1/mi2mu.1
+       /usr/local/man/man1/convert-mudela.1
+       /usr/local/man/man1/mudela-book.1
+       /usr/local/man/man1/lilypond.1
+       /usr/local/bin/lilypond
+       /usr/local/bin/mi2mu
+       /usr/local/share/lilypond/*
+       /usr/local/share/locale/@{it,nl@}/LC_MESSAGES/lilypond.mo
+@end example 
+
+
+The above assumes that you are root and have the GNU development
+tools, and your make is GNU make.  If this is not the case, you can
+adjust your environment variables to your taste:
+
+@example 
+
+       export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" 
+       ./configure
+@end example 
+
+@code{CPPFLAGS} are the preprocessor flags. 
+
+The configure script is Cygnus configure, and it will accept
+@strong{--help}. If you are not root, you will probably have to make it
+with a different @strong{--prefix} option.  Our favourite location is
+
+@example 
+
+       ./configure --prefix=$HOME/usr
+@end example 
+
+In this case, you will have to set up MFINPUTS, and TEXINPUTS accordingly.
+
+Since GNU LilyPond currently is beta, you are advised to also use
+
+@example 
+
+       --enable-debugging
+       --enable-checking
+@end example 
+
+Options to configure include:
+
+@table @samp
+@item @strong{--enable-printing}
+    Enable debugging print routines (lilypond @strong{-D} option)
+@item @strong{--enable-optimise}
+    Set maximum optimisation: compile with @strong{-O2}.  This can be
+unreliable on some compiler/platform combinations (eg, DEC Alpha and PPC)
+@item @strong{--enable-profiling}
+    Compile with support for profiling.
+@item @strong{--enable-config}
+    Output to a different configuration file.  Needed for multi-platform
+    builds
+@end table
+
+All options are documented in the @file{configure} help
+The option @strong{--enable-optimise} is recommended for Real Life usage.
+
+If you do
+
+@example 
+
+       make all
+@end example 
+
+everything will be compiled, but nothing will be installed.  The
+resulting binaries can be found in the subdirectories @file{out/} (which
+contain all files generated during compilation).
+
+@node CONFIGURING FOR MULTIPLE PLATFORMS, INSTALLING, CONFIGURING and COMPILING, INSTALL - compiling and installing GNU LilyPond
+@section CONFIGURING FOR MULTIPLE PLATFORMS
+
+If you want to compile LilyPond with different configuration settings,
+then, you can use the @strong{--enable-config} option.  Example: suppose I
+want to build with and   without profiling.  Then I'd use the
+following for the normal build, 
+
+@example 
+
+      ./configure --prefix=~ --disable-optimise --enable-checking
+      make
+      make install
+      
+@end example 
+
+and for the profiling version, I specify a different configuration.
+
+@example 
+
+      ./configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
+      make config=optprof
+      make config=optprof install
+@end example 
+
+
+@node INSTALLING, REDHAT LINUX, CONFIGURING FOR MULTIPLE PLATFORMS, INSTALL - compiling and installing GNU LilyPond
+@section INSTALLING
+
+If you have done a successful @code{make}, then a simple
+
+@example 
+
+       make install
+@end example 
+
+should do the trick.
+
+If you are doing an upgrade, please remember to remove obsolete
+@file{.pk} and @file{.tfm} files of the fonts.  A script has been
+provided to do the work for you, see @file{bin/clean-fonts.sh}.
+
+@unnumberedsec CAVEATS
+    
+
+@itemize @bullet
+@item The -O2 option  triggers  bugs on various platforms (PowerPC, Alpha).
+    If you experience problems, you  should first try  turning off
+    this.
+@item  On PPC you need at least EGCS-1.1.2f.
+@end itemize
+
+@node REDHAT LINUX, DEBIAN GNU/LINUX, INSTALLING, INSTALL - compiling and installing GNU LilyPond
+@section REDHAT LINUX
+
+RedHat Linux users can compile an RPM. A spec file is in
+@file{make/out/lilypond.spec}, it is distributed along with the
+sources.
+
+You can make the rpm by issuing
+@example 
+
+       rpm -tb lilypond-x.y.z.tar.gz
+       rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z
+@end example 
+
+Precompiled i386 RedHat RPMS are available from
+@url{ftp://freshmeat.net/pub/rpms/lilypond/} and
+@url{http://linux.umbc.edu/software/lilypond/rpms/}.
+
+For compilation on a RedHat system you need these packages,
+in addition to the those needed for running:
+@itemize @bullet
+@item glibc-devel
+@item libstdc++-devel
+@item guile-devel
+@item flex
+@item bison
+@item texinfo
+@end itemize
+
+@node DEBIAN GNU/LINUX, WINDOWS NT/95, REDHAT LINUX, INSTALL - compiling and installing GNU LilyPond
+@section DEBIAN GNU/LINUX
+
+A Debian package is also available; contact Anthony Fok
+@email{foka@@debian.org}.  The build scripts are in the subdirectory
+@file{debian/}.
+
+@node WINDOWS NT/95, w32, DEBIAN GNU/LINUX, INSTALL - compiling and installing GNU LilyPond
+@section WINDOWS NT/95
+@node w32, BUGS, WINDOWS NT/95, INSTALL - compiling and installing GNU LilyPond
+
+
+Separate instructions on building for W32 are available
+@url{../../outdir/README-W32.html}.
+
+@node BUGS, AUTHORS, w32, INSTALL - compiling and installing GNU LilyPond
+@section BUGS
+
+Send bug reports to bug-gnu-music@@gnu.org.  For help and questions use
+help-gnu-music@@gnu.org and gnu-music-discuss@@gnu.org.  Please consult
+the faq before mailing your problems.
+
+@node AUTHORS, Top, BUGS, INSTALL - compiling and installing GNU LilyPond
+@section AUTHORS
+
+@email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}
+
+@email{janneke@@gnu.org, Jan Nieuwenhuizen}
+
+In case of problems, please use the mailing list for help.
+
+Have fun!
+
+@bye
diff --git a/Documentation/topdocs/PATCHES.texi b/Documentation/topdocs/PATCHES.texi
new file mode 100644 (file)
index 0000000..d71dff6
--- /dev/null
@@ -0,0 +1,185 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename PATCHES.info
+@settitle Toplevel
+
+@node Top, , ,  (dir)
+@top
+
+@unnumberedsec name
+    
+
+PATCHES - track and distribute your code changes
+
+@unnumberedsec description
+    
+
+This page documents how to distribute your changes to GNU lilypond
+
+@unnumberedsec abstract
+    
+We would like to have unified context diffs with full pathnames.  A
+script automating supplied with Lily.
+
+ Distributing a change normally
+goes like this:
+
+@itemize @bullet
+@item make your fix/add your code 
+@item Add changes to NEWS, and add yourself to Documentation/topdocs/AUTHORS.yo
+@item generate a patch, 
+@item e-mail your patch to one of the mailing lists
+    gnu-music-discuss@@gnu.org or bug-gnu-music@@gnu.org
+@end itemize
+
+@unnumberedsec Generating a patch
+    
+
+In @file{VERSION}, set MY_PATCH_LEVEL:
+
+@example 
+
+    VERSION:
+       ...
+       MY_PATCH_LEVEL=jcn1
+@end example 
+
+In @file{CHANGES}, enter a summary of changes:
+
+@example 
+       pl 0.1.73.jcn1
+               - added PATCHES.texi
+@end example 
+
+Then, from the top of Lily's source tree, type
+
+@example 
+
+    make dist
+    make diff
+@end example 
+
+which rolls the tarball @file{../releases/lilypond-0.1.73.tar.gz}
+and leaves your patch as @file{./lilypond-0.1.73.jcn1.diff}.
+@footnote{'Make diff' generates a patch between two tarballs.  For 
+more info type 'make diff help=='.}  We assume that there is a tarball 
+@file{lilypond-0.1.73.tar.gz} in the directory @file{../releases}.
+
+If you didn't configure Lily using --srcdir, you can do:
+
+@example 
+
+    make release
+
+    tar-ball: ../patches/lilypond-0.1.73.jcn1.gz
+    patch: ../patches/lilypond-0.1.73.jcn1.gz
+@end example 
+
+@unnumberedsec Prerequisites
+    
+
+For creating a patch you need
+
+@itemize @bullet
+@item All items mentioned in @file{INSTALL}.  You're not going to send a patch
+    that you haven't even built, right?
+@item GNU diff
+@example 
+    make distclean
+    cd ..
+    diff -urN lilypond-0.1.73 lilypond-0.1.73.jcn1 > lilypond-0.1.73.jcn1
+@end example 
+
+but there are handy python scripts available.  If you're doing development,
+you'll need Python for other LilyPond scripts anyway.
+
+@item The Lily directory structure, which looks like:
+
+    @example 
+
+    doos/                        # gnu/windows32 build and binary releases
+    harmonia -> harmonia-x.y.z 
+    harmonia-x.y.z/
+    lilypond -> lilypond-x.y.z   # symlink to development directory
+    lilypond-x.y.z/              # current development
+    patches/                    # patches between different releases
+    RedHat/BUILD                 # RedHat build and binary releases
+    RedHat/RPMS
+    RedHat/SPECS
+    releases/                    # .tar.gz releases
+    test/                        # tarballs and diffs from current version
+    yodl -> yodl-1.30.17
+    yodl-1.30.17
+@end example 
+
+with prefix @file{$HOME/usr/src}
+and (for building rpms only) in @file{$HOME/.rpmrc}:
+@example 
+
+    topdir: /home/fred/usr/src/RedHat
+@end example 
+
+@end itemize
+       
+@unnumberedsec Applying patches
+    
+
+If you're following LilyPond development regularly, you probably want to
+download just the patch for each subsequent release.
+After downloading the patch (into the patches directory, of course), simply 
+apply it:
+
+@example 
+
+    gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E
+@end example 
+
+and don't forget to make automatically generated files:
+
+@example 
+
+    autoconf footnote(patches don't include automatically generated files, 
+    i.e. file(configure) and files generated by file(configure).)
+
+    configure
+@end example 
+
+@unnumberedsec Synchronise
+    
+
+If you're not very quick with sending your patch, there's a good
+chance that an new release of LilyPond comes available.  In such a
+case, the maintainer will probably ask you to make a new patch against
+the latest release.  Your best bet is to download the latest release,
+and apply your patch against this new source tree:
+
+@example 
+
+    cd lilypond-0.1.74
+    gzip -dc ../patches/lilypond-0.1.73.jcn1.diff.gz | patch -p1 -E
+    autoconf
+    configure
+@end example 
+
+Then, make a patch as shown above.
+
+@unnumberedsec See also
+    
+
+@file{stepmake/INSTALL.txt}
+
+@unnumberedsec maintainer
+    
+
+@email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}
+
+Just keep on sending those patches!
+
+
+@bye
diff --git a/Documentation/topdocs/README.texi b/Documentation/topdocs/README.texi
new file mode 100644 (file)
index 0000000..d7eb776
--- /dev/null
@@ -0,0 +1,135 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename README.info
+@settitle This is the toplevel README to LilyPond
+
+@node Top, , cdrom distributions, (dir)
+@top
+@menu
+* This is the toplevel README to LilyPond::This is the toplevel README to LilyPond
+@end menu
+
+
+
+
+@node This is the toplevel README to LilyPond, versioning, , Top
+@menu
+* versioning::                    versioning
+* requirements::                  requirements
+* installation::                  installation
+* documentation::                 documentation
+* comments::                      comments
+* windows 32::                    windows 32
+* caveats::                       caveats
+* bugs::                          bugs
+* cdrom distributions::           cdrom distributions
+@end menu
+@chapter This is the toplevel README to LilyPond
+
+
+LilyPond is a music typesetter.  It produces beautiful sheet music
+using a high level description file as input.  LilyPond is part of 
+the GNU Project.
+
+@node versioning, requirements, This is the toplevel README to LilyPond, This is the toplevel README to LilyPond
+@section versioning
+
+LilyPond uses a versioning scheme similar to the Linux kernel.  In a
+version "x.y.z", an even second number 'y' denotes a stable version.
+For development versions 'y' is odd.  For using straightforward score
+production, please use the latest stable version.  Development versions
+may not produce good or nice scores.
+
+@node requirements, installation, versioning, This is the toplevel README to LilyPond
+@section requirements
+
+For the compilation and running of LilyPond you need some additional
+packages.  Please refer to the installation instructions.
+
+NOTE: If you downloaded a binary (.rpm or a W95/NT .zip file), then
+you don't have to compile LilyPond.
+
+@node installation, documentation, requirements, This is the toplevel README to LilyPond
+@section installation
+
+For your convenience, a formatted copy of the INSTALL instructions are
+in the toplevel directory, as INSTALL.txt
+
+@node documentation, comments, installation, This is the toplevel README to LilyPond
+@section documentation
+
+The real documentation is the directory Documentation/
+
+If you want to read the documentation online, these are options:
+@itemize @bullet
+@item  use @file{.html}. Refer to INSTALL.txt for info on how to make the
+.html documentation.
+@item  use @file{.html}. Point your browser to
+@uref{http://www.cs.uu.nl/~hanwen/lilypond/index.html}.
+@item use @file{.dvi},  for the tutorial and reference manual. Do
+
+@example 
+  make -C Documentation/tex/ dvi 
+@end example 
+
+  
+@item  use ASCII. Do
+using @example 
+       make -C Documentation/
+@end example 
+
+@end itemize
+
+
+@node comments, windows 32, documentation, This is the toplevel README to LilyPond
+@section comments
+
+LilyPond is a long way from finished and polished.  We do appreciate
+criticism, comments, bugreports, patches, etc.
+@example 
+
+          Please send your e-mail to one of the MAILING LISTS
+@end example 
+
+and @emph{not} to us personally.  See @file{Documentation/links.yo} for more info.
+
+@node windows 32, caveats, comments, This is the toplevel README to LilyPond
+@section windows 32
+
+If you have received this file as part of a DOS/Window32 distribution
+(LilyPond-*.zip), then it is advisable to also download the source
+package, since it might contain more documentation
+@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/}
+
+If you decide to build LilyPond from source, please read the INSTALL.txt
+document first, especially the Windows NT/95 section.
+
+@node caveats, bugs, windows 32, This is the toplevel README to LilyPond
+@section caveats
+
+* Please read the file BUGS for some ugly bugs.  
+
+* If you have installed a previous version, be sure to remove old font
+files, eg
+@example 
+rm `find /var/lib/texmf/fonts -name 'feta*'` 
+@end example 
+
+a script to do this for you is in @file{buildscripts/clean-fonts.sh}
+
+@node bugs, cdrom distributions, caveats, This is the toplevel README to LilyPond
+@section bugs
+
+Send bug reports to bug-gnu-music@@gnu.org.  For help and questions use
+help-gnu-music@@gnu.org and gnu-music-discuss@@gnu.org.  Please consult
+the faq before mailing your problems.
+
+@node cdrom distributions, Top, bugs, This is the toplevel README to LilyPond
+@section cdrom distributions
+
+if you have received LilyPond on a cdrom, chances are that development
+has moved a some patchlevels up.  Please check the latest version of
+LilyPond before reporting bugs.
+
+
+@bye
diff --git a/Documentation/topdocs/index.tely b/Documentation/topdocs/index.tely
new file mode 100644 (file)
index 0000000..253c68c
--- /dev/null
@@ -0,0 +1,108 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename index.info
+@settitle index
+
+@node Top, , , (dir)
+@top
+
+
+
+@unnumbered LilyPond -- The @uref{http://www.fsf.org/gnu/gnu-history.html,GNU Project} Music Typesetter
+
+@quotation
+@mudela[fragment]
+       \relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
+@end mudela 
+@end quotation
+
+@c include BLURB?
+
+LilyPond is a music typesetter.  It produces beautiful sheet music
+using a high level description file as input.  LilyPond is part of 
+the GNU Project.
+
+@c include screenshot
+
+
+
+@unnumberedsec View sheet music
+    
+
+@itemize @bullet
+
+@item @uref{./input/out-www/index.html,Examples}:
+
+simple pieces, tests and bugs.  MIDI, PNG, PostScript, and Source.
+
+@item @uref{./mutopia/out-www/index.html,Music in Mutopia}:
+
+LilyPond handling real music.  MIDI, view PNG, PostScript, and Source.
+@end itemize
+
+@unnumberedsec Documentation
+    
+
+@itemize @bullet
+@item @uref{Documentation/tex/out-www/tutorial.html,Tutorial}
+@item @uref{Documentation/out-www/faq.html,FAQ}
+@item @uref{Documentation/out-www/mail.html,Mailing Lists}
+@item @uref{Documentation/out-www/index.html,All of the LilyPond documentation}
+@item @uref{./docxx/index.html,The DOC++ documentation of the C++ sources.}
+@item @uref{Documentation/topdocs/out-www/INSTALL.html,The installation instructions}
+@end itemize
+
+@unnumberedsec Sites
+    
+
+@itemize @bullet
+@item @uref{http://www.gnu.org/software/...}  LilyPond is part of the GNU
+project.  The webpages for the stable version reside at GNU.
+
+@item @uref{http://www.cs.uu.nl/people/hanwen/lilypond/} Han-Wen's site
+has the development pages.
+@item @uref{http://sca.uwaterloo.ca/lilypond/} Eric's mirror
+@item @uref{http://home.austin.rr.com/jbr/jeff/lilypond/} Jeff's Windows NT Distribution site
+@end itemize
+
+@unnumberedsec NEWS
+    
+
+This is what the latest version brings:
+@example 
+
+top_of_NEWS
+@end example 
+
+@unnumberedsec Download
+
+@itemize @bullet
+@item @uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/}
+@item @uref{http://sca.uwaterloo.ca/lilypond/}
+    Eric Praetzel was kind enough to provide a mirror of both the website
+    and the ftp site.
+@item  @uref{ftp://ftp.lilypond.org/pub/LilyPond/}
+       A mirror of the FTP site.  Updated at 0:00 MET daily. 
+@item @uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/} RedHat binary
+@item @uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex} Debian binary
+@item @uref{http://home.austin.rr.com/jbr/jeff/lilypond/} Windows NT binary
+@item @uref{http://linux.umbc.edu/software/lilypond/rpms/} i386 RPM.
+@item @uref{ftp://freshmeat.net/pub/rpms/lilypond/} i386 RPM.
+@end itemize
+
+@unnumberedsubsec Webmaster's Disclaimer
+
+These pages were entirely created from the LilyPond package-sources.
+Sorry for poor look they have: we want to be hacking at LilyPond, and
+not at the webpages.  If you want to volunteer for making shazzy
+webpages, then please mail us!
+
+Note: These pages are created from the latest @strong{development snapshots}
+of LilyPond, specifically, this page was made from LilyPond
+(fixme-version).tar.gz
+
+Note: the pages may have been created from an unreleased development
+version.  Please have patience, all changes will appear in the
+official version.
+
+@bye
diff --git a/NEWS b/NEWS
index 46cf0a67b59035067f163e612c17e5cf015ec174..1d595bfa445ef012ba196531a7972d9e642d1474 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -23,5 +23,3 @@ WHAT'S NEW?
 * More elegant spacing.  Text is spaced exactly.
 
 * Lots of bugfixes.
-
-pl 1.2.2.lec1 fix to abc2ly for fermata and space following >; to paddy.abc to include X: header line (lec1); to PATCHES.yo to point to real authors.yo
diff --git a/TODO b/TODO
index ae058662c9bad1a5b2330eadd4e9ca18ff701221..cb02f6a3d4ad6ae4bbcc6451ca8a2f4774e853e4 100644 (file)
--- a/TODO
+++ b/TODO
@@ -10,6 +10,10 @@ Grep -i for TODO, FIXME and ugh/ugr/urg.
 
 .* TODO
 . * use Rhythmic_head::position_i () for all Staff_referenced 
+. * bug: dots.
+. * mmrests
+. * web: download link.
+. * guile detection.
 . * Break_req handling is silly (break_forbid () + \break fucks up.)
 . * script engraver
 
@@ -41,7 +45,7 @@ the mensural music notation.
 bar line fully drawn across the staves and after that keep to the
 ChoirStaff bar line types in the rest of the scores
 
-. * autoBeamMelisma: if I explicitly beam notes in a staff with auto beaming disabled I
+- autoBeamMelisma: if I explicitly beam notes in a staff with auto beaming disabled I
 would like to have these beams also to be melismatic.
 
 . * make all Feta (including dynamics) available to the user in
@@ -59,16 +63,6 @@ abc2ly, midi2ly?
 . * mudela-book
 .  * center option (??)
 .  * make mudela-book understand usepackage{geometry}
-.  * check that linewidth set in \paper is not wider than actual linewidth?
-.  * the following fails because mudelabook doesn't care that the
-  last } after \end{mudela} finishes the marginpar:
-    \marginpar{
-    \begin{mudela}
-       c d e f g
-    \end{mudela}}
-.  * force-verbatim is maybe not that useful since latex fails with footnotes,
-  marginpars and others
-"""
 . * Key_engraver, Local_key_item
 . * Think of comprehensive solution for "if (grace_b == self_grace_b_)"
 . * String[String.length] doesn't trap.
@@ -126,7 +120,7 @@ vertically between the two staves):
 
 - The stemLength property should affect also beamed stems.
 
-. * align left edge of broken (de)cresc/slur/tie/tuplet/volta
+. * align left edge of broken tuplet-spanner (have a test case?)
 . * fix dynamics decently, ie. use kerning & ligatures.
 . * key restorations & repeats
 . * paperXX.ly \quartwidth, font setting not up to date. (Should read from AFM?)
@@ -150,7 +144,6 @@ one of the spacing bugs mentioned in the TODO.
 . * rhythmic staff & accidentals.
 . * use melismaBusy in Lyric context to typeset melismata correctly.  
 . * ly2dvi/lilypond logfile.
-. * def stem dir.
 . * hang Item on Spanner
 . * do --safe for PS output?
 . * msgfmt -o check?
@@ -219,7 +212,6 @@ able to vertically align the chorus midway between the staves.
 
 6. It would be nice to be able to put vertical brackets either side of a
 repeated section with different words for each repeat.
-
 . * Give # lines in linebreaking.  
 . * arrows on slurs.
 . * rewrite context defs using Scheme
@@ -231,7 +223,7 @@ repeated section with different words for each repeat.
 . * Align_element::padding  ?
 . * typo checks on property names?
 . * use streambufs and iostream
-       to provide IO handling for TeX stream, mudela stream, data-file.
+to provide IO handling for TeX stream, mudela stream, data-file.
 . * seriously buffer TeX output (do profile of writing .5 mb TeX file.)
 . * strip EXEs before installing
 . * zip target for binary windows dist (JBR)
@@ -251,7 +243,6 @@ repeated section with different words for each repeat.
 .  * kpathsea?
 . * fix vertical alignment and stafflines
 . * declaring Performers
-. * *.yo: fix pod manpage layout legacy
 . * text-items clash with stems/beams
 . * --include, -I option for ly2dvi (pass on to lily)
 . * fix placement of beam-less abbrev
index 7417b337a51d7eab838f745ec236ef798e988965..a7127718d839c23176ffaf4698e2c740f876c383 100644 (file)
@@ -152,7 +152,7 @@ AC_DEFUN(AC_STEPMAKE_GXX, [
     # ugh autoconf
     # urg, egcs: how to check for egcs >= 1.1?
     changequote(<<, >>)dnl
-    if $CXX --version | egrep '2\.8|2\.9' > /dev/null ||
+    if $CXX --version | egrep '2\.[89]' > /dev/null ||
        $CXX --version | grep 'egcs' > /dev/null
     changequote([, ])dnl
     then
@@ -163,19 +163,9 @@ AC_DEFUN(AC_STEPMAKE_GXX, [
 ])
 
 AC_DEFUN(AC_STEPMAKE_GUILE, [
-    # on some systems, -lguile succeeds for guile-1.3
-    # others need readline, dl (or even more)
-    # urg, must check for different functions in libguile
-    # to force new check iso reading from cache
-
-    # gh_scm2doubles,gh_doubles2scm are new in 1.3
     GUILE_FLAGS
-    AC_CHECK_LIB(guile, gh_scm2doubles,
-      [LIBS="`echo $GUILE_LDFLAGS | sed -e 's/-L[[/-_a-zA-Z0-9]]\+ //g'` $LIBS"
-      AC_DEFINE(HAVE_LIBGUILE)], , $GUILE_LDFLAGS dnl
-    )
-    if test "$ac_cv_lib_guile_gh_scm2doubles" != yes ; then
-       AC_STEPMAKE_WARN(You should install guile 1.3 or newer)
+    if guile-config --version 2>&1 | grep -q 'version 1\.[012]'; then
+       AC_STEPMAKE_WARN(Guile version 1.3 or better needed)
     fi
 ])
 
index be2cb00274d2222add1658f395f4e63e9e1de9ea..0c1b920b10581609bbeaa57a6e83eed450bf82fe 100644 (file)
@@ -5,8 +5,8 @@
 package-depth = @package_depth@
 
 USER_CFLAGS = @CFLAGS@
-USER_CXXFLAGS = @CXXFLAGS@ @CPPFLAGS@
-USER_LDFLAGS = 
+USER_CXXFLAGS = @CXXFLAGS@ @CPPFLAGS@ @GUILE_CFLAGS@
+USER_LDFLAGS = @GUILE_LDFLAGS@
 
 CC = @CC@
 CXX = @CXX@
index 3ebe0d3ded4635e6b90ef8d6e6fe31ae3f5b4fae..25bdbb0df3384dde6dde705e398a76e605947395 100755 (executable)
--- a/configure
+++ b/configure
@@ -1748,7 +1748,7 @@ fi
 
     # ugh autoconf
     # urg, egcs: how to check for egcs >= 1.1?
-        if $CXX --version | egrep '2\.8|2\.9' > /dev/null ||
+        if $CXX --version | egrep '2\.[89]' > /dev/null ||
        $CXX --version | grep 'egcs' > /dev/null
         then
            true
@@ -2924,17 +2924,11 @@ test -n "$YODL2TXT" || YODL2TXT="-echo no yodl"
     fi    
 
 
-    # on some systems, -lguile succeeds for guile-1.3
-    # others need readline, dl (or even more)
-    # urg, must check for different functions in libguile
-    # to force new check iso reading from cache
-
-    # gh_scm2doubles,gh_doubles2scm are new in 1.3
     
 ## The GUILE_FLAGS macro.
   ## First, let's just see if we can find Guile at all.
   echo $ac_n "checking for Guile""... $ac_c" 1>&6
-echo "configure:2938: checking for Guile" >&5
+echo "configure:2932: checking for Guile" >&5
   guile-config link > /dev/null || {
     echo "configure: cannot find guile-config; is Guile installed?" 1>&2
     exit 1
@@ -2945,56 +2939,9 @@ echo "configure:2938: checking for Guile" >&5
   
   echo "$ac_t""yes" 1>&6
 
-    echo $ac_n "checking for gh_scm2doubles in -lguile""... $ac_c" 1>&6
-echo "configure:2950: checking for gh_scm2doubles in -lguile" >&5
-ac_lib_var=`echo guile'_'gh_scm2doubles | sed 'y%./+-%__p_%'`
-if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
-  echo $ac_n "(cached) $ac_c" 1>&6
-else
-  ac_save_LIBS="$LIBS"
-LIBS="-lguile $GUILE_LDFLAGS      $LIBS"
-cat > conftest.$ac_ext <<EOF
-#line 2958 "configure"
-#include "confdefs.h"
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char gh_scm2doubles();
-
-int main() {
-gh_scm2doubles()
-; return 0; }
-EOF
-if { (eval echo configure:2972: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_lib_$ac_lib_var=no"
-fi
-rm -f conftest*
-LIBS="$ac_save_LIBS"
-
-fi
-if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  LIBS="`echo $GUILE_LDFLAGS | sed -e 's/-L[/-_a-zA-Z0-9]\+ //g'` $LIBS"
-      cat >> confdefs.h <<\EOF
-#define HAVE_LIBGUILE 1
-EOF
-
-else
-  echo "$ac_t""no" 1>&6
-fi
-
-    if test "$ac_cv_lib_guile_gh_scm2doubles" != yes ; then
-       
-    echo "configure: warning: You should install guile 1.3 or newer" 1>&2
+    if guile-config --version 2>&1 | grep -q 'version 1\.012'; then
+       
+    echo "configure: warning: Guile version 1.3 or better needed" 1>&2
     warn_b=yes
 
     fi
@@ -3002,7 +2949,7 @@ fi
 
 
 echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
-echo "configure:3006: checking for 8-bit clean memcmp" >&5
+echo "configure:2953: checking for 8-bit clean memcmp" >&5
 if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3010,7 +2957,7 @@ else
   ac_cv_func_memcmp_clean=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 3014 "configure"
+#line 2961 "configure"
 #include "confdefs.h"
 #ifdef __cplusplus
 extern "C" void exit(int);
@@ -3023,7 +2970,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:3027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:2974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_memcmp_clean=yes
 else
@@ -3041,12 +2988,12 @@ echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
 test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"
 
 echo $ac_n "checking for vprintf""... $ac_c" 1>&6
-echo "configure:3045: checking for vprintf" >&5
+echo "configure:2992: checking for vprintf" >&5
 if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3050 "configure"
+#line 2997 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char vprintf(); below.  */
@@ -3072,7 +3019,7 @@ vprintf();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_vprintf=yes"
 else
@@ -3096,12 +3043,12 @@ fi
 
 if test "$ac_cv_func_vprintf" != yes; then
 echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
-echo "configure:3100: checking for _doprnt" >&5
+echo "configure:3047: checking for _doprnt" >&5
 if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3105 "configure"
+#line 3052 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char _doprnt(); below.  */
@@ -3127,7 +3074,7 @@ _doprnt();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func__doprnt=yes"
 else
@@ -3154,12 +3101,12 @@ fi
 for ac_func in memmem snprintf vsnprintf gettext
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3158: checking for $ac_func" >&5
+echo "configure:3105: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3163 "configure"
+#line 3110 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3185,7 +3132,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3189: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3224,7 +3171,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3228: checking for $ac_word" >&5
+echo "configure:3175: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_MAKEINFO'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
diff --git a/input/bugs/addlyrmus.fly b/input/bugs/addlyrmus.fly
new file mode 100644 (file)
index 0000000..32b095b
--- /dev/null
@@ -0,0 +1,4 @@
+
+\context Voice \addlyrics
+               { s8 s16 s32 s64 }
+               { [c16 c c c] }
index 66f99d1de7294d3da99c9d1337394acf70247d93..4372115e2023a736d3671a4c868019c422cc14fe 100644 (file)
@@ -1,2 +1,2 @@
 
-<f, c' d e f>
+\context Voice { <f,4. c'' d e f>}
index 2a51746a62aa5662fb8c4e7ffde76f7bf8912f96..59fd4de8d15e13f7f288baa68ec935629ccb2bb2 100644 (file)
@@ -3,7 +3,7 @@
 \score {
        \notes \relative c'' {
        \time 2/4;
-       \property Voice.beamAuto=0
+       \property Voice.noAutoBeaming=1
        a4 a8
        a32 a a a
 }
diff --git a/input/bugs/l.ly b/input/bugs/l.ly
new file mode 100644 (file)
index 0000000..f042e73
--- /dev/null
@@ -0,0 +1,13 @@
+\score {
+          \notes {
+               \repeat volta 5 {
+                       c' c' c' c'
+               }
+               \alternative {
+                       {d' d' d' d'}
+                       {e' e' e' e'}
+               }
+               f'
+           }
+       }
+
diff --git a/input/bugs/utremi_old.ly b/input/bugs/utremi_old.ly
new file mode 100644 (file)
index 0000000..60a6240
--- /dev/null
@@ -0,0 +1,262 @@
+\header {\r
+filename = "utremi.ly";\r
+enteredby = "Christian Mondrup";\r
+%composer = "Thomas Ravenscroft";\r
+opus = "Thomas Ravenscroft";\r
+%opus = "Pammelia, 1609, no. 31";\r
+arranger = "Pammelia, 1609, no. 31";\r
+title = "Vt, re, me, fa, sol, la, sol, fa, re, vt";\r
+tagline = "Typeset with GNU LilyPond by Christian Mondrup. Non-commercial copying welcome.";\r
+}\r
+\r
+papersize = "letter"\r
+\r
+\include "paper16.ly"\r
+%\include "a4.ly"\r
+\r
+lyricsOne = \lyrics {\r
+   ""\breve ""8\r
+   "Vt,"\breve re, me, fa, sol, la, ""\r
+   sol, la, fa, me, re, vt. \r
+}\r
+\r
+lyricsTwo = \lyrics {\r
+   "" ""\r
+   Hey downe downe hey downe downe downe downe hey down\r
+   hey down "" down down a.\r
+   My heart of gold as true as steele\r
+   as I me leant "" vn -- to the bowres.\r
+   but if my La -- dy loue me well,\r
+   Lord so Ro -- bin bowres,\r
+}\r
+\r
+lyricsThree = \lyrics {\r
+   "" "" "" "" "" "" "" "" "" "" "" ""\r
+   heaue and hoe Rum -- be -- lo, hey tro -- lo tro -- ly lo,\r
+   hey tro -- ly trol -- ly hey tro -- ly trol -- ly \r
+   hey tro -- ly trol -- ly hey trol -- "" ly trol -- ly lo. \r
+   My La -- dies gone to Can -- ter -- bu -- ry\r
+   S. Tho -- mas be her boote.\r
+   Shee met with Kate of Malms -- "" bu -- ry,  \r
+   why weepst thou ma -- ple \r
+}\r
+\r
+lyricsFour = \lyrics {\r
+   "" \r
+   roote:\r
+   O sleepst thou or wakst thon Ies -- se -- ry, Cooke,\r
+   the rost it burnes, turne round turne round "" a -- bout ""\r
+   turne round "" a -- bout, ""\r
+   turne round "" a -- bout, "" turne round. ""\r
+   O Fri -- er how fares thy ban -- de -- low ban -- de -- low\r
+   Fri -- er, how fares thy San -- de -- low, San -- de -- low.\r
+}\r
+\r
+global = \notes {\r
+   \key c;\r
+   %\time 4/2;\r
+   %\time 17/8;\r
+   \time 33/16;\r
+   \clef "tenor";\r
+}\r
+\r
+dummyBeat = \notes {\r
+   \property Staff.defaultBarType = "||"\r
+   \property Staff.barAlways = "1" \r
+   s16\r
+   \property Staff.barAlways = "0"\r
+   \property Staff.defaultBarType = "|"\r
+}\r
+\r
+incipOne = \notes\relative c' {\r
+   g\breve \r
+   \dummyBeat\r
+   \bar "";\r
+}\r
+\r
+incipTwo = \notes\relative c'' {\r
+   \property Voice.noteHeadStyle = "diamond"\r
+   g1. \r
+   \property Voice.noteHeadStyle = ""\r
+   f2 \r
+   \dummyBeat\r
+   \bar "";\r
+}\r
+\r
+incipThree = \notes\relative c' {\r
+   \property Voice.noteHeadStyle = "harmonic"\r
+   \property Voice.tupletVisibility = 0\r
+   \times 2/3 { d4. e8 d4 } \times 2/3 { b4. a8 g4 }\r
+   \times 2/3 { b4. c8 b4 } \times 2/3 { b4. a8 g4 }\r
+   \dummyBeat\r
+   \property Voice.tupletVisibility = 3\r
+   \bar "";\r
+}\r
+\r
+incipFour = \notes\relative c' {\r
+   \property Voice.noteHeadStyle = "diamond"\r
+   %\property Voice.restStyle = "mensural"\r
+   b1 r1\r
+   \dummyBeat\r
+   \bar "";\r
+}\r
+\r
+partOne = \notes\relative c' {\r
+   %\property Score.currentBarNumber = "1"\r
+   \property Voice.noteHeadStyle = ""\r
+   %\property Staff.barNumberScriptPadding = 1\r
+   g1 ~ | g | a ~ | a | bes ~ | bes | c ~ | c | d ~ | d | e ~ | e |\r
+   r | r | \r
+   e ~ | e | d ~ | d | c ~ | c | bes ~ | bes | a ~ | a | g ~ | g\r
+   \bar "|.";\r
+}\r
+\r
+partTwo = \notes\relative c'' {\r
+   \property Voice.noteHeadStyle = ""\r
+   g2. f4 | e2 d | c4. b8 a4 g | f2 e |\r
+   d g ~ | g4 a g2 | c,1 | r2 c |\r
+   g'2. a4 | b2 g | c c | c c |\r
+   b4 c d2 ~ | d4 d b g | c1 | r2 c |\r
+   g g | d2. e4 | f2 e | c1 |\r
+   g'2. g4 | g2 g | c,1 ~ | c | r | r \r
+   \bar "|.";\r
+}\r
+\r
+partThree = \notes\relative c' {\r
+   \property Voice.noteHeadStyle = ""\r
+   \times 2/3 { d4. e8 d4 } \times 2/3 {b4. a8 g4 } | \r
+   \times 2/3 { b4. c8 b4 } \times 2/3 { b4. a8 g4 }\r
+   c2 c4 c | c2 c |\r
+   d2 d4 d | d2 d | e2. f4 | e2 d4 c |\r
+   b2 g ~ | g4 f e d | c1 | r2 c |\r
+   g'2. g4 | g2 g | c,2. c4 | c c c'2 |\r
+   bes g | bes bes | a1 | r2 e' |\r
+   d d | g g | a2. g4 | fis e d2 |\r
+   g g | d2. c4 \r
+   \bar "|.";\r
+}\r
+\r
+partFour = \notes\relative c' {\r
+   \property Voice.noteHeadStyle = ""\r
+   b1^\fermata | r2 g' | e e4 e | a2. g4 | \r
+   fis2 e4 d | g1 | g2 g | g g |\r
+   g g | g g ~ | g4 f e d | c2 d ~ |\r
+   d4 c b a | g2 g' ~ | g4 f e d | c2 g' ~ |\r
+   g r | \times 2/3 { r1 d2 } \times 2/3 { a'2 a g } |\r
+   \times 2/3 { e1 f2 } \times 2/3 { g2. g4 g2 }\r
+   \times 2/3 { d2. d4 e2 } \times 2/3 { f2. f4 e2 }\r
+   \times 2/3 { d1 c2 } \times 2/3 { b2. a4 g2 }\r
+   \times 2/3 { d'2. d4 d2 }\r
+   \bar "|.";\r
+}\r
+\r
+partOneStaff =  <\r
+   \context Staff = vocal1 <\r
+      \property Staff.clefStyle = "fullSizeChanges"\r
+      \property Staff.instrument = "\large{1.}"\r
+      %\property Staff.instr = ""\r
+      \notes { \r
+        \global\r
+         \property Staff.timeSignatureStyle = "old4/4"\r
+         \incipOne\r
+         \clef "G_8";\r
+        \property Staff.timeSignatureStyle = "C2/2"\r
+        \time 4/4;\r
+        \partOne \r
+      }\r
+      {\context Lyrics = lyrOne \lyricsOne }\r
+   >\r
+>\r
+\r
+partTwoStaff = <\r
+   \context Staff = vocal2 <\r
+      \property Staff.clefStyle = "fullSizeChanges"\r
+      \property Staff.instrument = "\large{2.}"\r
+      %\property Staff.instr = ""\r
+      %\property Voice.automaticMelismata = "1"\r
+      \addlyrics\r
+      \notes { \r
+        \global\r
+         \property Staff.timeSignatureStyle = "old4/4"\r
+         \incipTwo\r
+        \clef "G_8";\r
+        \property Staff.timeSignatureStyle = "C2/2"\r
+        \time 4/4;\r
+        \partTwo\r
+      }\r
+      {\context Lyrics = lyrTwo \lyricsTwo }\r
+   >\r
+>\r
+\r
+\r
+partThreeStaff = <\r
+   \context Staff = vocal3 <\r
+      \property Staff.clefStyle = "fullSizeChanges"\r
+      \property Staff.instrument = "\large{3.}"\r
+      %\property Staff.instr = ""\r
+      %\property Voice.automaticMelismata = "1"\r
+      \addlyrics\r
+      \notes { \r
+         \context Voice = vthree \r
+           \property Voice.tupletDirection = \up\r
+        \global\r
+         \property Staff.timeSignatureStyle = "old4/4"\r
+         \incipThree\r
+        \clef "G_8";\r
+        \property Staff.timeSignatureStyle = "C2/2"\r
+        \time 4/4;\r
+        \partThree\r
+      }\r
+      {\context Lyrics = lyrThree \lyricsThree }\r
+   >\r
+>\r
+\r
+partFourStaff = <\r
+   \context Staff = vocal4 <\r
+      \property Staff.clefStyle = "fullSizeChanges"\r
+      \property Staff.timeSignatureStyle = "C2/2"\r
+      \property Staff.barNumberDirection = \up\r
+      \property Staff.instrument = "\large{4.}"\r
+      \property Staff.instr = ""\r
+      %\property Voice.automaticMelismata = "1"\r
+      \addlyrics\r
+      \notes { \r
+         \context Voice = vfour \r
+           \property Voice.tupletDirection = \up\r
+        \global\r
+        %\property Staff.instrument = "\large{4.}"\r
+        %\property Staff.instr = ""\r
+         \property Staff.timeSignatureStyle = "old4/4"\r
+         \incipFour\r
+        \clef "G_8";\r
+        \property Staff.timeSignatureStyle = "C2/2"\r
+        \time 4/4;\r
+        \partFour \r
+      }\r
+      {\context Lyrics = lyrFour \lyricsFour} \r
+   >\r
+>\r
+\r
+\score {\r
+   \context StaffGroup <\r
+      \partFourStaff\r
+      \partThreeStaff\r
+      \partTwoStaff\r
+      \partOneStaff\r
+  >\r
+   %\paper {\translator {\BarNumberingStaffContext } } \r
+   \paper {\r
+      indent = 0.\mm;\r
+      linewidth = 17.0\cm;\r
+      textheight = 27.0\cm;\r
+      gourlay_maxmeasures=6.0;\r
+      \translator { \StaffContext\r
+         \consists "Staff_margin_engraver"; }  \r
+      %\translator { \ScoreContext\r
+      %   minVerticalAlign = 1.5*\staffheight; }\r
+   }\r
+   %\midi { \r
+   %   output = "utremi.mid";\r
+   %   \tempo 2 = 80;\r
+   %}\r
+}\r
index 346c5c8a56dea577b9d639b9351358329e2a7852..d05959555bf5df9ce00866a2180d2c8aabbeabfa 100644 (file)
@@ -2,11 +2,11 @@
 %  no alts.
 \score { \notes
   \relative c'' {
-\repeat semi 3 { c^"3$\\times$ 0alt" d }
+\repeat volta 3 { c^"3$\\times$ 0alt" d }
 % less alts than body
-\repeat semi 4 { c^"4$\\times$ 2alt" d } \alternative { e f }
+\repeat volta 4 { c^"4$\\times$ 2alt" d } \alternative { e f }
 
 % more alts than body
-\repeat semi 2 { c^"2$\\times$ 3alt" d } \alternative { e f g } 
+\repeat volta 2 { c^"2$\\times$ 3alt" d } \alternative { e f g } 
 }}
 
index 2401502c9c9124a35d9ba6e8c9449b689fb2d741..825715087278c8bec9a73018639dfbda8cf7ecd7 100644 (file)
@@ -26,7 +26,7 @@ Crescendo::Crescendo ()
 Molecule
 Crescendo::get_symbol () const
 {
-  Real w_dim = extent (X_AXIS).length ();
+  Real w_dim = extent (X_AXIS).length () - get_broken_left_end_align ();
   Real absdyn_dim = paper_l ()-> get_realvar (ly_symbol ("crescendo_shorten"));
   if (dyn_b_drul_[LEFT])
     {
@@ -63,7 +63,8 @@ Crescendo::do_brew_molecule_p () const
 {
   Molecule* m_p =0;
   Real absdyn_dim = paper_l ()-> get_realvar (ly_symbol ("crescendo_shorten"));
-  Real x_off_dim=0.0;
+  Real x_off_dim =  get_broken_left_end_align ();
+
   if (dyn_b_drul_[LEFT])
     x_off_dim += absdyn_dim;
 
index 723cf5a2836da9079507fb18d35347677107019d..3494e6b11dc575ff563ec6c629149dbb5cfa4af8 100644 (file)
@@ -9,7 +9,6 @@
 
 #include "parray.hh"
 #include "virtual-methods.hh"
-#include "directed-graph.hh"
 #include "graphical-element.hh"
 #include "lily-guile.hh"
 
index 828391d70bdf9f53e45b6c7f713e9312105ad387..9cca78c8c48061bf5e2e11e7818e998b6061335b 100644 (file)
@@ -68,6 +68,7 @@ protected:
     this is virtual; for instance, Line_of_score overrides it.
     */
   virtual void break_into_pieces ();
+  Real get_broken_left_end_align () const;
 
   friend Axis_group_spanner; // UGH
 
index 214aab5098e3545e954137f878a02be06fe02b23..dc6d8d547acdb50d09fbf80299bccfe80eecaadf 100644 (file)
@@ -50,7 +50,8 @@ Multi_measure_rest::do_brew_molecule_p () const
     {
       Item * col = spanned_drul_[d]->column_l ();
 
-      Interval coldim = col->extent (X_AXIS);
+      Interval coldim = col->extent (X_AXIS)
+       + col->relative_coordinate (0, X_AXIS);
 
       sp_iv[d] = coldim[-d]  ;
     }
index c725690a4ac37a0a3ef69e3485ce476440a3f5c2..5243ff56cd77771a7e33626bde5e2eea255e9e1f 100644 (file)
@@ -54,6 +54,7 @@ Note_heads_engraver::do_process_requests()
        {
          Dots * d = new Dots;
          note_p->dots_l_ = d;
+         d->dots_i_ = note_req_l->duration_.dots_i_;
 
          Scalar dir = get_property ("verticalDirection",0);
          if (dir.isdir_b())
index 01023778241cdb0687a866060585d4faaa703bf4..401b120842f365814c7283ef9b143a1c30e45878 100644 (file)
@@ -19,7 +19,7 @@ Paper_stream::Paper_stream (String filename)
   if (filename.length_i () && (filename != "-"))
     os = new ofstream (filename.ch_C ());
   else
-//    os = new ostream (cout.ostreambuf ());
+    //    os = new ostream (cout.ostreambuf ());
     os = new ostream (cout._strbuf);
   if (!*os)
     error (_f ("can't open file: `%s\'", filename));
@@ -46,56 +46,57 @@ Paper_stream::operator << (Scalar s)
 {
   for (char const *cp = s.ch_C (); *cp; cp++)
     {
-       if (outputting_comment)
-         {
-           *os << *cp;
-           if (*cp == '\n')
-             {
-               outputting_comment=false;
-
-             }
-           continue;
-         }
-       line_len_i_ ++;
-       switch (*cp)
+      if (outputting_comment)
+       {
+         *os << *cp;
+         if (*cp == '\n')
            {
-           case '%':
-               outputting_comment = true;
-               *os << *cp;
-               break;
-           case '{':
-               nest_level++;
-               *os << *cp;
-               break;
-           case '}':
-               nest_level--;
-               *os << *cp;
-
-               if (nest_level < 0)
-                 {
-                   delete os;  // we want to see the remains.
-                   assert (nest_level>=0);
-                 }
-
-               /* don't break line if not nested; very ugly for ps */
-               if (nest_level == 0)
-                 break;
-
-               /* FALLTHROUGH */
-
-           case '\n':
-               break_line ();
-               break;
-           case ' ':
-               *os <<  ' ';
-               if (line_len_i_ > MAXLINELEN)
-                  break_line ();
-
-               break;
-           default:
-               *os << *cp;
-               break;
-             }
+             outputting_comment=false;
+
+           }
+         continue;
+       }
+      line_len_i_ ++;
+      switch (*cp)
+       {
+       case '%':
+         outputting_comment = true;
+         *os << *cp;
+         break;
+       case '{':
+         nest_level++;
+         *os << *cp;
+         break;
+       case '}':
+         nest_level--;
+         *os << *cp;
+
+         if (nest_level < 0)
+           {
+             delete os;        // we want to see the remains.
+             assert (nest_level>=0);
+           }
+
+         /* don't break line if not nested; very ugly for ps */
+         if (nest_level == 0)
+           break;
+
+         *os << '%';
+         break_line ();
+         break;
+       case '\n':
+         break_line ();
+         break;
+       case ' ':
+         *os <<  ' ';
+         if (line_len_i_ > MAXLINELEN)
+           break_line ();
+
+         break;
+       default:
+         *os << *cp;
+         break;
+       }
     }
   //urg, for debugging only!!
   *os << flush;
@@ -105,8 +106,7 @@ Paper_stream::operator << (Scalar s)
 void
 Paper_stream::break_line ()
 {
-  // aaargh
-  *os << "%\n";
+  *os << '\n';
   *os << to_str (' ', nest_level);
   line_len_i_ = 0;
 }
index 57b1b2bf88e8a13cff6b3377e8fc8ebac5d6ed5f..3b6da8cf4ee1cf69ed1bb31116bb4754ba8ab12e 100644 (file)
@@ -104,7 +104,8 @@ Repeated_music::alternatives_length_mom () const
     {
       m = m + p->car_->length_mom ();
       done ++;
-      if (repeats_i_ - done < alternatives_p_->length_i ())
+      if (volta_fold_b_
+         || repeats_i_ - done < alternatives_p_->length_i ())
        p = p->next_;
     }
   return m;
index aef1e884bb1163753dda1c64c89f8cbf0dd248a4..d3436d462b13c73237fd628ab75128dd5f2e77bf 100644 (file)
@@ -53,6 +53,7 @@ Rest_engraver::do_process_requests ()
        {
          dot_p_ = new Dots;
          rest_p_->dots_l_  =dot_p_;
+         dot_p_->dots_i_ = rest_req_l_->duration_.dots_i_;       
          announce_element (Score_element_info (dot_p_,0));
        }
       if (rest_p_->balltype_i_ >= 2) 
index 2838bcce9642dee6082194e64c946ec860b84424..8585589bd9a5e18a789c0c50e2696bbc556e2e59 100644 (file)
@@ -27,7 +27,6 @@
 #include "encompass-info.hh"
 #include "main.hh"
 
-
 Slur::Slur ()
 {
 }
@@ -186,11 +185,7 @@ Slur::do_post_processing ()
       */
       else
        {
-         /*
-           need break-align too.  what about other spanners?
-          */
-         if (d == LEFT)
-           dx_f_drul_[d] = spanned_drul_[LEFT]->extent (X_AXIS).length ();
+         dx_f_drul_[d] = get_broken_left_end_align ();
                
          /*
            broken: should get y from other piece, so that slur
index df73a595a43266bb6cbc433eb312ca0afc2a4e73..64ebe46a6b9b52b76cedb9eb4f8ed46c3f32c473 100644 (file)
@@ -165,6 +165,9 @@ Spacing_spanner::do_measure (int col1, int col2) const
          else
            stretch_dist += right_dist;
 
+         if (s.distance_f_ <0)
+           programming_error("negative dist");
+         
          if (stretch_dist == 0.0)
            {
              /*
index 843a020b36995a8ba63ec867eeeeeeb08675ac3c..ca2f5d5618124553beb744034d9f0cb8e68ada26 100644 (file)
@@ -12,6 +12,8 @@
 #include "paper-score.hh"
 #include "molecule.hh"
 #include "paper-outputter.hh"
+#include "score-column.hh"
+#include "line-of-score.hh"
 
 void
 Spanner::do_print() const
@@ -33,7 +35,7 @@ Spanner::break_into_pieces ()
         
   Item * left = spanned_drul_[LEFT];
   Item * right = spanned_drul_[RIGHT];
-  
+
   if  (left == right)
     {
       warning (_ ("left spanpoint is right spanpoint\n"));
@@ -70,7 +72,7 @@ Spanner::break_into_pieces ()
       span_p->set_bounds(LEFT,info.bounds_[LEFT]);
       span_p->set_bounds(RIGHT,info.bounds_[RIGHT]);
       pscore_l_->typeset_element (span_p);
-             
+
       info.broken_spanner_l_ = span_p;
       span_p->handle_broken_dependencies();
 
@@ -223,3 +225,31 @@ Spanner::handle_broken_dependents ()
        programming_error ("Spanner y -refpoint lost.");
     }
 }
+
+// If this is a broken spanner, return the amount the left end is to
+// be shifted horizontally so that the spanner starts after the
+// initial clef and key on the staves. This is necessary for ties,
+// slurs, crescendo and decrescendo signs, for example.
+Real
+Spanner::get_broken_left_end_align () const
+{
+  int i;
+  Line_of_score *l;
+  Score_column *sc = dynamic_cast<Score_column*> (spanned_drul_[LEFT]->column_l());
+
+  // Relevant only if left span point is first column in line
+  if(sc != NULL && sc->line_l ()->cols_.find_i (sc) == 0)
+    {
+      // We could possibly return the right edge of the whole Score_column here,
+      // but we do a full search for the Break_align_item.
+      for(i = 0; i < sc->elem_l_arr_.size (); i++)
+       {
+         if(0 == strcmp (classname (sc->elem_l_arr_[i]), "Break_align_item"))
+           {
+             return sc->elem_l_arr_[i]->extent (X_AXIS) [RIGHT];
+           }
+       }
+    }
+
+  return 0.0;
+}
index a74e1c8bf35df963350fc99083f22a33a5d807ce..b0cefd1e1b76f5a8f321dc86e50802b21d00884b 100644 (file)
@@ -158,7 +158,7 @@ Staff_side_element::do_print () const
     DOUT << "positioning " << to_position_l_->name();
 
   DOUT << "axis == " << axis_name_str (axis_)
-       << ", dir == " << to_str (dir_ );
+       << ", dir == " << to_str ((int)dir_ );
 #endif
 }
 
index 7b682914c3144e8117f1acf5e40702ab76ba561c..eeaf89fa984794989c00582f6d0fa78476aa82e4 100644 (file)
@@ -130,7 +130,7 @@ Tie::do_post_processing()
   if (head_l_drul_[LEFT])
     dx_f_drul_[LEFT] = head_l_drul_[LEFT]->extent (X_AXIS).length ();
   else
-    dx_f_drul_[LEFT] = spanned_drul_[LEFT]->extent (X_AXIS).length ();
+    dx_f_drul_[LEFT] = get_broken_left_end_align ();
   dx_f_drul_[LEFT] += x_gap_f;
   dx_f_drul_[RIGHT] -= x_gap_f;
 
index bcc2424106b80a23caed1042856ef5ebf45946e5..a227d07d7cc425f5dd56a265d7cd6d324dc30ebd 100644 (file)
@@ -48,7 +48,7 @@ Volta_spanner::do_brew_molecule_p () const
   Real t = paper_l ()->get_realvar (volta_thick_scm_sym);
 
   Real dx = internote_f;
-  Real w = extent (X_AXIS).length () - dx;
+  Real w = extent (X_AXIS).length () - dx - get_broken_left_end_align ();
   Real h = paper_l()->get_var ("volta_spanner_height");
   Molecule volta (lookup_l ()->volta (h, w, t, no_vertical_start, no_vertical_end));
 
@@ -98,6 +98,7 @@ Volta_spanner::do_post_processing ()
 {
   if (bar_arr_.size())
     translate_axis (bar_arr_[0]->extent (Y_AXIS)[UP], Y_AXIS);
+  translate_axis (get_broken_left_end_align (), X_AXIS);
 }
 
 void
index c2e1b202e52d2799717f84fd7718d6d41315dc77..b6c04a5e48765403ee447d7c529cc7e3fa1938a2 100644 (file)
@@ -11,14 +11,3 @@ $(outdir)/%.latex: %.doc
 $(outdir)/%.texi: %.tely
        cd $(outdir); $(PYTHON) $(depth)/../scripts/mudela-book.py -I .. -I $(depth)/../input/test/ --dependencies --format=texi ../$<
 
-$(outdir)/%.info: $(outdir)/%.texi
-       makeinfo --output=$@ $<
-
-$(outdir)/%.html:      $(outdir)/%.texi
-       makeinfo --output=$@ --html --no-headers $< 
-       $(PYTHON) $(step-bindir)/add-html-footer.py --package=$(topdir) --index=$(depth)/../index.html $@ $(wildcard $(basename $@)[0-9][0-9].html)
-
-$(outdir)/%.dvi:       $(outdir)/%.texi
-       # --clean only in >= 3.12s
-       # cd $(outdir); texi2dvi --clean ../$< 
-       cd $(outdir); texi2dvi ../$< 
index 8b137891791fe96927ad78e64b0aad7bded08bdc..e032d7ee59da0ee580e7967954f6938b5163084d 100644 (file)
@@ -1 +1,2 @@
+# empty
 
index 8b137891791fe96927ad78e64b0aad7bded08bdc..024d2ab564fbc9faabe06a86555cb4a39d88cfbb 100644 (file)
@@ -1 +1,4 @@
+# empty
+TELY_FILES := $(wildcard *.tely)
+EXTRA_DIST_FILES += $(TELY_FILES)
 
index f2d5c1a058093286fa13f40b3ea35d06fde31331..b25deb22b24015b1469201187f65550c7fc2b399 100644 (file)
@@ -1,5 +1,5 @@
 %!PS-Adobe-1.0: lily.ps
-
+%
 % 2 setlanguagelevel %  hmm. auto_resize_dicts doesn't help either. 
 % round cappings
 1 setlinecap
index ecfda6b42d247461940e9ec7660e95c187571cb8..cba847f06be1b1457fde1209bc4dc6cce5b5ac32 100644 (file)
     (string-append
      "\\font" (font-switch i) "=" s "\n"))
 
-  ;; UGH
-   
-  (define (header-end) "\\input lilyponddefs \\turnOnPostScript")
+  (define (header-end)
+    (string-append
+     "\\special{! "
+     (regexp-substitute/global #f "\n" (ly-gulp-file "lily.ps") 'pre " %\n" 'post)
+     "}"
+     "\\input lilyponddefs \\turnOnPostScript"))
 
   (define (header creator generate) 
     (string-append
index 8021e5181800d88377bbddee58db4a980e64d417..e679cae1d839fc059ae71f51a0bb02a4ab90f90e 100644 (file)
@@ -69,7 +69,7 @@ output_dict= {
     }
   >
 \end{mudela}""", 
-               'output-mudela':r"""\begin%s{mudela}
+               'output-mudela':r"""\begin[%s]{mudela}
 %s
 \end{mudela}""",
                'output-verbatim': r"""\begin{verbatim}%s\end{verbatim}""",
@@ -135,7 +135,7 @@ re_dict = {
                 'mudela-file': '@mudelafile(\[[^\\]]+\])?{([^}]+)}',
                 'mudela' : '@mudela(\[.*?\])?{(.*?)}',
                 'mudela-block': r"""(?s)@mudela(\[.*?\])?(.*?)@end mudela""",
-                'interesting-cs': r"""[\\@](node|mudelagraphic)""",
+                'interesting-cs': r"""[\\@](chapter|section)""",
                  'comma-sep' : ', *',           
                 }
        }
@@ -223,27 +223,32 @@ def compose_full_body (body, opts):
 
        # urg: breaks on \include of full score
        # Use nofly option if you want to \include full score.
-       if not 'nofly' in opts and not re.search ('\\\\score', body):
-               opts.append ('fly')
+       if 'nofly'  not in opts and not re.search ('\\\\score', body):
+               opts.append ('fragment')
 
-       if  'fragment' in opts or 'singleline' in opts:
+       if 'fragment' in opts and 'nosingleline' not in opts:
+               opts.append ('singleline')
+
+       if 'singleline' in opts:
                l = -1.0;
        else:
                l = latex_linewidths[cols][paper][latex_size]
 
 
-       if 'fly' in opts:
+       if 'relative' in opts:
+               body = '\\relative c { %s }' % body
+
+       
+       if 'fragment' in opts:
                body = r"""\score { 
-  \notes\relative c {
-    %s
-  }
+  \notes { %s }
   \paper { }  
 }""" % body
 
         opts = uniq (opts)
         optstring = string.join (opts, ' ')
        optstring = re.sub ('\n', ' ', optstring)
-               
+       
        body = r"""
 %% Generated by mudela-book.py; options are %s
 \include "paper%d.ly"
@@ -420,7 +425,8 @@ def find_mudela_shorthands (b):
                str = f.read (-1)
                opts = match.group (1)
                if opts:
-                       opts = re.split (',[ \n\t]*', opts[1:-1])
+                       opts = opts[1:-1]
+                       opts = re.split (',[ \n\t]*', opts)
                else:
                        opts = []
 
@@ -432,8 +438,6 @@ def find_mudela_shorthands (b):
                        opts .append ('nofly')
                        
                str_opts = string.join (opts, ',')
-               if str_opts: str_opts = '[' + str_opts + ']'
-
 
                str = ("%% copied from file `%s'\n" % full_path) + str 
                return get_output ('output-mudela') % (str_opts, str)
@@ -444,7 +448,7 @@ def find_mudela_shorthands (b):
        
 def find_mudela_chunks (str):
        """Find mudela blocks, while watching for verbatim. Returns
-       (STR,MUDS) with \mudelagraphic substituted for the blocks in STR,
+       (STR,MUDS) with  substituted for the blocks in STR,
        and the blocks themselves MUDS"""
   
        chunks = []
@@ -499,7 +503,7 @@ def advance_counters (counter, opts, str):
                                pass
                elif g == 'chapter':
                        (chapter, section, count)  = (chapter + 1, 0, 0)
-               elif g == 'section' or g == 'node':
+               elif g == 'section':
                        (section, count)  = (section + 1, 0)
                        
 
index 66401aa09a5b403964f8a07a8430276270dd71d0..c71271fe54474a141352dafa9ff4c791b93956fa 100644 (file)
@@ -150,7 +150,7 @@ AC_DEFUN(AC_STEPMAKE_GXX, [
     # ugh autoconf
     # urg, egcs: how to check for egcs >= 1.1?
     changequote(<<, >>)dnl
-    if $CXX --version | egrep '2\.8|2\.9' > /dev/null ||
+    if $CXX --version | egrep '2\.[89]' > /dev/null ||
        $CXX --version | grep 'egcs' > /dev/null
     changequote([, ])dnl
     then
@@ -161,19 +161,9 @@ AC_DEFUN(AC_STEPMAKE_GXX, [
 ])
 
 AC_DEFUN(AC_STEPMAKE_GUILE, [
-    # on some systems, -lguile succeeds for guile-1.3
-    # others need readline, dl (or even more)
-    # urg, must check for different functions in libguile
-    # to force new check iso reading from cache
-
-    # gh_scm2doubles,gh_doubles2scm are new in 1.3
     GUILE_FLAGS
-    AC_CHECK_LIB(guile, gh_scm2doubles,
-      [LIBS="`echo $GUILE_LDFLAGS | sed -e 's/-L[[/-_a-zA-Z0-9]]\+ //g'` $LIBS"
-      AC_DEFINE(HAVE_LIBGUILE)], , $GUILE_LDFLAGS dnl
-    )
-    if test "$ac_cv_lib_guile_gh_scm2doubles" != yes ; then
-       AC_STEPMAKE_WARN(You should install guile 1.3 or newer)
+    if guile-config --version 2>&1 | grep -q 'version 1\.[012]'; then
+       AC_STEPMAKE_WARN(Guile version 1.3 or better needed)
     fi
 ])
 
index 9c4126e0a1b78252b2a59ce338a41d9d4bc1831e..9ffa512c3319c9de18c086ba4513603803e91ba4 100644 (file)
@@ -10,7 +10,7 @@ version = '0.1'
 import sys
 import os
 import time
-from string import *
+import string 
 import getopt
 import __main__
 
@@ -29,13 +29,17 @@ This page was built from %s-%s by\
 
 (options, files) = getopt.getopt(sys.argv[1:], 'hp:', ['help', 'news=', 'index=', 'package=']) 
 
+def gulp_file (fn):
+       f = open (fn)
+       return f.read ()
+
 def help ():
-    sys.stdout.write ("Usage: add-html-footer [OPTION]... HTML-FILE\n"
-                "Add a nice footer, add the top of the NEWS file (up to the ********)\n\n"
-                + "Options:\n"
-                + "  -h, --help             print this help\n"
-                + "  -p, --package=DIR      specify package\n"
-                     )
+    sys.stdout.write (r"""Usage: add-html-footer [OPTION]... HTML-FILE
+Add a nice footer, add the top of the NEWS file (up to the ********)
+Options:
+  -h, --help             print this help
+  -p, --package          package name (ugh. Junkme.)
+  """)
     sys.exit (0)
 
 for opt in options:
@@ -93,8 +97,8 @@ if news_file:
     news = news[:i]
     
 def check_tag (tag, sub, s, bottom):
-    tag = lower (tag)
-    TAG = upper (tag)
+    tag = string.lower (tag)
+    TAG = string.upper (tag)
     s = regsub.sub (tag, TAG, s)
     i = regex.search (TAG, s)
     if i < 0:
@@ -130,16 +134,6 @@ for f in files:
        s = '<HTML>\n' + s
     s = check_tag ('</html>', '</HTML>', s, 1)
 
-    #urg
-    if regex.search ('@COUNTER_REF@', s) != -1:
-       counter = ''
-       try:
-           counter = os.environ[package.NAME + '_COUNTERPATH']
-           counter = '<hr><img src="' + counter + '">\n'
-       except:
-           pass
-       s = regsub.gsub ('@COUNTER_REF@', counter, s)
-
     dump_file (f, s)
 
 
index 92c0d1644a99dfdb82d6cecb1e78939836dc0771..98eb250d51f3a0a40915d76c6c445c31c8c0116f 100644 (file)
@@ -7,7 +7,11 @@ version = '0.1'
 
 import sys
 import os
-from string import *
+import string
+
+def gulp_file (fn):
+       f = open (fn)
+       return f.read ()
 
 import __main__
 import glob
index 2645a6fd53e895466583202dd5219787b61ce329..4919c80f0334fae5bcbf21d7142e9c2e665bfe3a 100644 (file)
@@ -5,10 +5,14 @@ version = '0.62'
 
 import sys
 import os
-from string import *
+import string
 import getopt
 import pipes
 
+def gulp_file (fn):
+       f = open (fn)
+       return f.read ()
+
 def program_id ():
        return name + ' ' + version;
 
@@ -159,7 +163,7 @@ def makediff (fromdir, todir, patch_name):
 def main ():
        os.environ['GZIP'] = '-q'
        identify ()
-       print 'argv: ' + join (sys.argv[2:])
+       print 'argv: ' + string.join (sys.argv[2:])
        (options, files) = getopt.getopt (sys.argv[1:], 
                'hF:f:o:p:rT:t:', ['from=', 'dir-from=', 'dir-to=', 'help', 'output=', 'package=', 'release', 'to='])
 
index a1b8bab54649316c9c5def950cd5e53beb9c4a40..1950f569354970c830d58cdd5a510d99aa6a9317 100755 (executable)
@@ -9,8 +9,8 @@
 
 import regex
 import regsub
-from string import *
-# from flower import *
+import string
+
 import sys
 import os
 import getopt
@@ -37,7 +37,7 @@ class Package:
                dict = read_makefile (dirname + '/VERSION')
                version_list = []
                for x in [ 'MAJOR_VERSION', 'MINOR_VERSION',   'PATCH_LEVEL']:
-                       version_list.append (atoi (dict[x]))
+                       version_list.append (string.atoi (dict[x]))
                version_list.append (dict['MY_PATCH_LEVEL'])
                self.topdir = dirname
                self.groupdir = self.topdir + '/..'
@@ -46,12 +46,12 @@ class Package:
                self.test_dir = self.groupdir + '/test/'
                self.version =  tuple(version_list)
                self.Name = dict['PACKAGE_NAME']
-               self.name = lower (self.Name)
+               self.name = string.lower (self.Name)
                if self.name == 'lilypond':
                        self.nickname = 'lelie'
                else:
                        self.nickname = self.name
-               self.NAME = upper (self.Name)
+               self.NAME = string.upper (self.Name)
 
 
 class Packager:
@@ -79,7 +79,7 @@ def full_version_tup(tup):
 
 def split_my_patchlevel(str):
        return (regsub.sub('[0-9]*$', '', str),
-               atoi(regsub.sub('[^0-9]*', '', str)))
+               string.atoi(regsub.sub('[^0-9]*', '', str)))
        
 
 def next_version(tup):
@@ -120,12 +120,12 @@ def version_tuple_to_str(tup):
        return ('%d.%d.%d' % tup[0:3]) + my
 
 def version_str_to_tuple(str):
-       t = split(str, '.')
+       t = string.split(str, '.')
        try:
                mypatch = t[3]
        except IndexError:
                mypatch = ''
-       return (atoi(t[0]), atoi(t[1]), atoi(t[2]), mypatch)
+       return (string.atoi(t[0]), string.atoi(t[1]), string.atoi(t[2]), mypatch)
 
 def version_compare (tupl, tupr):
        tupl = full_version_tup (tupl)
@@ -134,9 +134,9 @@ def version_compare (tupl, tupr):
                if tupl[i] - tupr[i]: return tupl[i] - tupr[i]
        if tupl[3] and tupr[3]:
                lname = regsub.sub('[0-9]*$', '', tupl[3])
-               lnum = atoi(regsub.sub('[^0-9]*', '', tupl[3]))
+               lnum = string.atoi(regsub.sub('[^0-9]*', '', tupl[3]))
                rname = regsub.sub('[0-9]*$', '', tupr[3])
-               rnum = atoi(regsub.sub('[^0-9]*', '', tupr[3]))
+               rnum = string.atoi(regsub.sub('[^0-9]*', '', tupr[3]))
                if lname != rname:
                        raise 'ambiguous'
                return sign (lnum - rnum)
@@ -161,18 +161,3 @@ def dump_file(f, s):
        i.write(s)
        i.close ()
 
-def gulp_file(f):
-       try:
-               i = open(f)
-               i.seek (0, 2)
-               n = i.tell ()
-               i.seek (0,0)
-       except:
-               sys.stderr.write( 'can\'t open file %s\n ' % f)
-               return ''
-       s = i.read (n)
-       if len (s) <= 0:
-               sys.stderr.write( 'gulped empty file: %s\n'% f)
-       return s
-
-
index 437116fbcc7842547a02fa4395a388374821b913..6cfc2f1c2d7eda06bde03ee39288b806f502abb7 100644 (file)
@@ -11,124 +11,139 @@ name = 'table-to-html'
 
 import os
 import sys
-
 import getopt
-from string import *
-import regex
-import regsub
+import string
 import time
+import re
+
+format = 'html'
 
 def program_id ():
-    return name + ' version ' + version;
+       return name + ' version ' + version;
 
 def identify ():
-    sys.stdout.write (program_id () + '\n')
+       sys.stdout.write (program_id () + '\n')
 
 def help ():
-    sys.stdout.write ("Usage: table-to-html [OPTION]... TABLE-FILE HTML-FILENAME\n"
-                + "Generate pretty table from char separated table\n\n"
-                + "Options:\n"
-                + "  -h, --help             print this help\n"
-                + "  -p, --package=DIR      specify package\n"
-                + "  -s, --separator=SEP    specify separator [:]\n"
-                + "  -t, --latex            do latex output instead\n"
-                     )
-    
-    sys.exit (0)
+       sys.stdout.write (
+r"""Usage: table-to-html [OPTION]... TABLE-FILE HTML-FILENAME
+Generate pretty table from char separated table
+Options:
+  -h, --help                    print this help
+  -p, --package=DIR      specify package
+  -s, --separator=SEP  specify separator [:]
+  -t, --latex                  do latex output instead
+""")
+       sys.exit (0)
 
 
 def header (html):
-    html.write ('<body bgcolor=white><table cellspacing=10>')
+       html.write ('<body bgcolor=white><table cellspacing=10>')
 
 def footer (html):
-    html.write ('</table></body>')
-
-def convert_html (inname, outname, cols, separator, linesep):
-    table = open (inname)
-    # ugh
-    html = open (outname, 'w')
-
-    header (html)
-    i = 0
-    for line in table.readlines ():
-       i = i + 1
-       if not len(line):
-           continue
-       columns = split (line, separator)
-       html_line = '<tr><td>' + join (columns, '</td><td>') + '</td></tr>'
-       html_line= regsub.gsub (linesep, ' ',html_line)
-       html.write (html_line)
-
-       if len (columns) <> cols:
-               print i
-               raise 'not enough cols'
-
-    table.close ()
-    footer (html)
-    html.close ()
-
-
-def convert_tex (inname, outname, cols, separator, linesep):
-    table = open (inname)
-    html = open(outname, 'w')
-
-    i = 0
-    for line in table.readlines ():    
-       i = i + 1
-       if not len(line):
-           continue
-       columns = split (line, separator)
-       if len (columns) <> cols:
-               print i
-               raise 'not enough cols'
-
-       tex_line =  '\\tableentry{' + join (columns, '}{') + '}\n'
-       tex_line = regsub.gsub (linesep, ' ', tex_line)
-       html.write (tex_line)
-       
-    table.close ()
-    html.close ()
-
-def main ():
-    identify ()
-    (options, files) = getopt.getopt (
-       sys.argv[1:], 'tl:o:hp:c:s:', ['columns=', 'help', 'latex', 'output=', 'package=', 'separator=', 'linesep='])
-    latex = 0
-    separator = '@'
-    output = ''
-    linesep = '\r'
-    for opt in options:
+       html.write ('</table></body>')
+
+def convert_html (lines, outname, cols, separator, linesep):
+       # ugh
+       html = open (outname, 'w')
+
+       header (html)
+       i = 0
+       for line in lines:
+               i = i + 1
+               if not len(line):
+                       continue
+               columns = string.split (line, separator)
+               html_line = '<tr><td>' + string.join (columns, '</td><td>') + '</td></tr>'
+               html_line= re.sub (linesep, ' ', html_line)
+               html.write (html_line)
+
+               if len (columns) <> cols:
+                               print i
+                               raise 'not enough cols'
+
+       footer (html)
+       html.close ()
+
+
+def convert_tex (lines, outname, cols, separator, linesep):
+       html = open(outname, 'w')
+       header = r"""\documentclass{article}
+\begin{document}
+{\parindent -1pc
+       \parskip 0pc\parsep 0pc
+       %  COMMENT( from the texbook)
+       \def\length#1{\count0=0 \getlength#1\end}
+       \def\getlength#1{\ifx#1\end \let\next=\relax
+         \else\advance\count0 by1 \let\next=\getlength\fi \next}
+         \def\inlanguage#1#2{{\length{#2}%
+               \ifnum\count0=0
+               \else
+               \emph{#1}: #2.
+               \fi}}
+       \small
+
+       \def\tableentry#1#2#3#4#5#6#7{\par{\bf #1}: #7
+         \inlanguage{Fran\c cais}{#2}
+          \inlanguage{British}{#4}  \inlanguage{Deutsch}{#3}
+          \inlanguage{Nederlands}{#5}\inlanguage{Italiano}{#6}}
+"""
+
+       html.write (header)
+       i = 0
+       for line in lines:
+               i = i + 1
+               if not len(line):
+                       continue
+               columns = string.split (line, separator)
+               if len (columns) <> cols:
+                               print i
+                               raise 'not enough cols'
+
+               tex_line =  '\\tableentry{' + string.join (columns, '}{') + '}\n'
+               tex_line = re.sub (linesep, ' ', tex_line)
+               html.write (tex_line)
+               
+       html.write(r"""}\end{document}""")
+       html.close ()
+
+def convert_texinfo (lines, outname, cols, separator, linesep):
+               pass
+
+
+
+identify ()
+(options, files) = getopt.getopt (
+       sys.argv[1:], 'f:tl:o:h:c:s:', ['columns=', 'help', 'format=', 'output=', 'separator=', 'linesep='])
+latex = 0
+separator = '@'
+output = ''
+linesep = '\r'
+for opt in options:
        o = opt[0]
        a = opt[1]
        if o == '--separator' or o == '-s':
-           separator = a
+               separator = a
        elif o== '--help' or o == '-h':
-           help ()
-       elif o=='--latex' or o == '-t':
-           latex = 1
+               help ()
+       elif o=='--format' or o == '-f':
+               format = a
        elif o == '--output' or o == '-o':
-           output = a
-       elif o == '--package' or o == '-p':
-           topdir=a
+               output = a
        elif o == '--linesep' or o == '-l':
                linesep = a
        elif o == '--columns' or o == '-c':
-               cols =  atoi(a)
+               cols =  string.atoi(a)
        else:
-           print o
-           raise getopt.error
-
-    sys.path.append (topdir + '/stepmake/bin')
-    from packagepython import *
-    package = Package (topdir)
-    packager = Packager ()
-
-    from flower import *
+               print o
+               raise getopt.error
 
-    if latex:
-       convert_tex (files[0], output,  cols, separator, linesep)
-    else:
-       convert_html (files[0], output, cols, separator, linesep)
+lines = open (files[0]).readlines ()
 
-main ()
+if format == 'latex':
+       convert_tex (lines, output,  cols, separator, linesep)
+elif format == 'html':
+       convert_html (lines, output, cols, separator, linesep)
+elif format == 'texi':
+       convert_texinfo (lines, output, cols, separator, linesep)
 
diff --git a/stepmake/stepmake/texinfo-targets.make b/stepmake/stepmake/texinfo-targets.make
new file mode 100644 (file)
index 0000000..1bb8bf6
--- /dev/null
@@ -0,0 +1 @@
+# empty
diff --git a/stepmake/stepmake/texinfo-vars.make b/stepmake/stepmake/texinfo-vars.make
new file mode 100644 (file)
index 0000000..3a7e7ae
--- /dev/null
@@ -0,0 +1,4 @@
+
+TEXI_FILES = $(wildcard *.texi)
+
+EXTRA_DIST_FILES += $(TEXI_FILES)
index cb353c583b22a63a214989fef2c207c5cacbd82d..da9907c536de0d950d32eee236e6d375a25182cc 100644 (file)
 % the code faster, and more reliable (less flexible)
 
 
-%
-% TODO : use GUILE for this kind of muckery.
-%
-
-{%
-   \def\par{ }%         %Ugh.  Don't try this at home, kids!
-   % neat file-include trick by Piet van Oostrum <piet@cs.uu.nl>
-   \newread\defin 
-   \newtoks\toksfiledefi\newtoks\toksfiledefii 
-   \def\ifnot#1{#1\else\expandafter\expandafter\fi\iffalse\iftrue\fi} 
-   \def\filedef#1#2{%#1=command name, #2=file name 
-           \openin\defin=#2\relax\def#1{} 
-           \ifeof\defin
-                   \message{***************** CAN NOT OPEN #2 ********************}
-                   \end
-           \fi 
-           \loop\ifnot{\ifeof\defin}\read\defin to\tempfiledef
-           \toksfiledefi=\expandafter{#1}% 
-           \toksfiledefii=\expandafter{\tempfiledef}% 
-   %        \expandafter\special\expandafter{!\the\toksfiledefi\the\toksfiledefii}\repeat%
-          \global\edef#1{\the\toksfiledefi\the\toksfiledefii}\repeat%
-   }
-   %
-   % This seems a little backwards, but we don't want to include the PS
-   % stuff too early
-   %
-   \filedef\includelilyps{lily.ps}%
-   \expandafter\special{! \includelilyps }
-}
-
-
 \def\turnOnPostScript{%
         % This sets CTM so that you get to the currentpoint
         % by executing a 0 0 moveto
@@ -53,7 +22,6 @@
                 \special{ps: @beginspecial @setspecial ##1 @endspecial}       
         }
         %
-
         \special{! 
 /stafflinethickness \mudelapaperstaffline\space def
 /interline \mudelapaperinterline\space def