From: Han-Wen Nienhuys Date: Thu, 2 Sep 1999 00:17:49 +0000 (+0200) Subject: release: 1.2.5 X-Git-Tag: release/1.2.5 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e4a2733b4c0ab484305dc19fc598d70a9631539b;p=lilypond.git release: 1.2.5 --- diff --git a/AUTHORS.txt b/AUTHORS.txt index 824ab30814..ed7b21bbf7 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,73 +1,64 @@ - AUTHORS - who did what on GNU LilyPond? -Contents +AUTHORS - who did what on GNU LilyPond? +*************************************** -This file lists authors of GNU LilyPond, and what they -wrote. This list is alphabetically ordered. + This file lists authors of GNU LilyPond, and what they wrote. This +list is alphabetically ordered. -o Tom Cato Amundsen , cembalo-par- - tita in mudela, accordion symbols, some mudela-book.py + * Tom Cato Amundsen , cembalo-partita in + mudela, accordion symbols, some mudela-book.py -o Mats Bengtsson , - http://www.s3.kth.se/~matsb/ lots of testing, fixes, - general comments and contributions. + * Mats Bengtsson , + `http://www.s3.kth.se/~matsb/' lots of testing, fixes, general + comments and contributions. -o Eric Bullinger , accidental trans- - position. + * Eric Bullinger , accidental transposition. -o Jan Arne Fagertun , - TeX titling and lytodvi.sh + * Jan Arne Fagertun , TeX + titling and lytodvi.sh -o Anthony Fok , debian package: debian/* + * Anthony Fok , debian package: debian/* -o Bjoern Jacke german glossary - stuff. + * Bjoern Jacke german glossary stuff. -o Neil Jerram . parts of Documenta- - tion/Vocab* + * Neil Jerram . parts of + Documentation/Vocab* -o Donald Ervin Knuth, http://www-cs-staff.stan- - ford.edu/~knuth/ mf/ital-*.mf (these were taken from - the CM fonts) + * Donald Ervin Knuth, `http://www-cs-staff.stanford.edu/~knuth/' + mf/ital-*.mf (these were taken from the CM fonts) -o Michael Krause , breathing - signs + * Michael Krause , breathing signs -o Werner Lemberg , misc + * Werner Lemberg , misc bugfixes, some Beam and Stem code. -o David R. Linn , Mailing list + * David R. Linn , Mailing list maintenance. -o Adrian Mariano <> Reference manual, tutorial fixes, - glossary. + * Adrian Mariano <> Reference manual, tutorial fixes, glossary. -o Han-Wen Nienhuys , - http://www.cs.uu.nl/~hanwen/ Main author (initials: - HWN). + * Han-Wen Nienhuys , + `http://www.cs.uu.nl/~hanwen/' Main author (initials: HWN). -o Jan Nieuwenhuizen , - http://www.xs4all.nl/~jantien/ Main author (initials: - JCN). + * Jan Nieuwenhuizen , + `http://www.xs4all.nl/~jantien/' Main author (initials: JCN). -o Alexandre Oliva , http://sun- - site.unicamp.br/~oliva/ testing + * Alexandre Oliva , + `http://sunsite.unicamp.br/~oliva/' testing -o Franc,ois Pinard , parts of - Documentation/Vocab*, started internationalization + * Franc ois Pinard, parts of + Documentation/Vocab*, started internationalization stuff - stuff + * Glen Prideaux , minor bug fix to + script used to generate doc++ documentation -o Glen Prideaux , minor bug fix - to script used to generate doc++ documentation + * Jeffrey B. Reed , Windows-NT support. -o Jeffrey B. Reed , Windows-NT sup- - port. + * Shay Rojanski Some mudela source. -o Shay Rojanski Some mudela source. + * Laura Conrad (lconrad@world.std.com) fixes to abc2ly -o Laura Conrad (lconrad@world.std.com) fixes to abc2ly + Your name could be here! If you want to fix something, do it, and +send us a patch! -Your name could be here! If you want to fix something, do -it, and send us a patch! diff --git a/CHANGES b/CHANGES index 8fa3170237..2f0e5efd8d 100644 --- 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 ********** diff --git a/Documentation/COPERTINA.yo b/Documentation/COPERTINA.yo index dd4c568b46..af415d654b 100644 --- a/Documentation/COPERTINA.yo +++ b/Documentation/COPERTINA.yo @@ -5,5 +5,4 @@ nsect(LilyPond includefile(COPERTINA.in) nl() -pic(schermo) diff --git a/Documentation/FLAPTEKST.yo b/Documentation/FLAPTEKST.yo index b144222ceb..ced2a0271e 100644 --- a/Documentation/FLAPTEKST.yo +++ b/Documentation/FLAPTEKST.yo @@ -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) diff --git a/Documentation/metadoc/GNUmakefile b/Documentation/metadoc/GNUmakefile index ebce9188b1..2df6d42828 100644 --- a/Documentation/metadoc/GNUmakefile +++ b/Documentation/metadoc/GNUmakefile @@ -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 diff --git a/Documentation/scherm.in b/Documentation/scherm.in deleted file mode 100644 index 005b6451c3..0000000000 --- a/Documentation/scherm.in +++ /dev/null @@ -1,16 +0,0 @@ -18:46:03 mub ~/lelie$ lilypond twinkle -GNU LilyPond 0.1.78/FlowerLib 1.1.44. -Ontleden...[/home/fred/usr/src/lilypond/init/init.ly[/home/fred/usr/src/lilypond/init/declarations.ly[/home/fred/usr/src/lilypond/init/dynamic.ly][/home/fred/usr/src/lilypond/init/nederlands.ly][/home/fred/usr/src/lilypond/init/script.ly][/home/fred/usr/src/lilypond/init/paper20.ly[/home/fred/usr/src/lilypond/init/table20.ly][/home/fred/usr/src/lilypond/init/table13.ly][/home/fred/usr/src/lilypond/init/table16.ly][/home/fred/usr/src/lilypond/init/params.ly[/home/fred/usr/src/lilypond/init/a4.ly][/home/fred/usr/src/lilypond/init/paper.ly][/home/fred/usr/src/lilypond/init/engraver.ly]]][/home/fred/usr/src/lilypond/init/midi.ly[/home/fred/usr/src/lilypond/init/performer.ly]][/home/fred/usr/src/lilypond/init/property.ly]][/home/fred/usr/src/lilypond/input/twinkle.ly]] -Vertolken van muziek...[8][16][24][25] -duur: 1.34 seconden -Voorbewerken van elementen... [/home/fred/usr/src/lilypond/mf/out/feta20.afm] -Berekenen van kolomposities... [3][6][9][12][15][18][21][24][25] -geschat: 231 regels (van gemiddeld 21.4 kolommen) -exact berekend: 66 regels (van gemiddeld 25.5 kolommen) -duur: 6.11 seconden -Nabewerken van elementen... -TeX uitvoer naar twinkle.tex... - -Vertolken van muziek... -duur: 0.22 seconden -MIDI uitvoer naar twinkle.midi... diff --git a/Documentation/schermo.in b/Documentation/schermo.in deleted file mode 100644 index b4fb407537..0000000000 --- a/Documentation/schermo.in +++ /dev/null @@ -1,16 +0,0 @@ -18:37:15 mub ~/lelie$ lilypond twinkle -GNU LilyPond 0.1.78/FlowerLib 1.1.44. -Analizzare...[/home/fred/usr/src/lilypond/init/init.ly[/home/fred/usr/src/lilypond/init/declarations.ly[/home/fred/usr/src/lilypond/init/dynamic.ly][/home/fred/usr/src/lilypond/init/nederlands.ly][/home/fred/usr/src/lilypond/init/script.ly][/home/fred/usr/src/lilypond/init/paper20.ly[/home/fred/usr/src/lilypond/init/table20.ly][/home/fred/usr/src/lilypond/init/table13.ly][/home/fred/usr/src/lilypond/init/table16.ly][/home/fred/usr/src/lilypond/init/params.ly[/home/fred/usr/src/lilypond/init/a4.ly][/home/fred/usr/src/lilypond/init/paper.ly][/home/fred/usr/src/lilypond/init/engraver.ly]]][/home/fred/usr/src/lilypond/init/midi.ly[/home/fred/usr/src/lilypond/init/performer.ly]][/home/fred/usr/src/lilypond/init/property.ly]][/home/fred/usr/src/lilypond/input/twinkle.ly]] -Interpretare musica...[8][16][24][25] -durata: 1.36 secondi -Preprocessare elementi... [/home/fred/usr/src/lilypond/mf/out/feta20.afm] -Calcolare posizioni di colonne... [3][6][9][12][15][18][21][24][25] -approssimato: 231 linee (con una media di 21 colonne): -calcolato esattamente: 66 linee (con una media di 25 colonne) -durata: 6.14 secondi -Postprocessare elementi... -Prodotto di TeX verso twinkle.tex... - -Interpretare musica... -durata: 0.21 secondi -Prodotto di MIDI verso twinkle.midi... diff --git a/Documentation/tex/GNUmakefile b/Documentation/tex/GNUmakefile index 6fd3cf7762..fd0723e714 100644 --- a/Documentation/tex/GNUmakefile +++ b/Documentation/tex/GNUmakefile @@ -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=' ' --package=$(topdir) -o $@ $< + $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep=' ' -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=' ' --package=$(topdir) -o $@ --latex $< +$(outdir)/%.latex: %.data $(depth)/VERSION + $(PYTHON) $(step-bindir)/table-to-html.py --columns=7 --linesep=' ' -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 diff --git a/Documentation/tex/glossary.yo b/Documentation/tex/glossary.yo deleted file mode 100644 index eb929dd2e3..0000000000 --- a/Documentation/tex/glossary.yo +++ /dev/null @@ -1,85 +0,0 @@ - -COMMENT(-*-text-*-) - -DEFINEMACRO(var)(1)(whenlatex(latexcommand({\normalfont\scshape )ARG1+latexcommand(}))\ - whenhtml(sc(ARG1))) - - - -COMMENT( This document contains Mudela fragments. You need at least -Yodl-1.30.18 to convert this to tex or html. - -TODO - -in stead <-> instead -) - -htmlbodyopt(bgcolor)(white) -htmlcommand() - -latexlayoutcmds( -\setlength{\topmargin}{-0.25in} -\setlength{\textheight}{9in} -\setlength{\textwidth}{5.875in} -\setlength{\oddsidemargin}{0.25in} -\setlength{\evensidemargin}{0.25in} -) - - -whenlatex(notableofcontents()) -whentexinfo(notableofcontents()) - -article(Glossary of notation terms) - (Han-Wen Nienhuys and Jan Nieuwenhuizen) - () - -COMMENT( - -* The [ ] look weird - -* paragraphs have too much space. - -) - - -latexcommand(\def\interexample{}) -latexcommand(\def\preexample{\par}) -latexcommand(\def\postexample{\par\medskip}) -latexcommand(\def\file#1{{code(#1)}}) -COMMENT( -latexcommand(\def\texttt#1{\tt #1}) -latexcommand(\def\textbf#1{\bf #1}) -) - -This glossary is far from complete. Additions are welcome. - -whenlatex(latexcommand( - {\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 - - % COMMENT(\def\tableentry#1#2#3#4#5#6#7{\par\textbf{#1}: #7) - \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}} - \input glossary-table - } - - \bibliography{engraving} - \bibliographystyle{plain} -)) - -whenhtml( - includeverbatim(DOEXPAND(outdir)/glossary-table.html) -) - diff --git a/Documentation/tex/html-disclaimer.yo-urg b/Documentation/tex/html-disclaimer.yo-urg deleted file mode 100644 index 061f9d441e..0000000000 --- a/Documentation/tex/html-disclaimer.yo-urg +++ /dev/null @@ -1,16 +0,0 @@ -COMMENT( -I cannot be named .yo, because i'm not a complete document, yodl2x will break. -) - -whenhtml( - -nsubsect(Disclaimer) - -This document is written in url(Yodl)(ftp://ftp.lilypond.org/pub/yodl) -and should foremost produce nice LaTeX() output. In other formats, -such as html, some things will look a bit different, while other -things will be simply left out. Therefore, the authoritive version of -this document is the PostScript version, produced via LaTeX(). As you -know, url(no gifs due to patent -problems)(http://www.gnu.org/philosophy/gif.html), but the PNG images -should be viewable with any current browser . ) diff --git a/Documentation/tex/lilypond-regtest.doc b/Documentation/tex/lilypond-regtest.doc deleted file mode 100644 index 79ad4b8331..0000000000 --- a/Documentation/tex/lilypond-regtest.doc +++ /dev/null @@ -1,294 +0,0 @@ -% -*-LaTeX-*- vim:tw=72 -\documentclass{article} - -\title{LilyPond feature test} -\author{Han-Wen Nienhuys} -\begin{document} -\maketitle - -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 -\verb+\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 -\texttt{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} - -\def\bla#1{%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{document} diff --git a/Documentation/tex/mudela-book-doc.doc b/Documentation/tex/mudela-book-doc.doc index 46c2423c9b..e4afd2e915 100644 --- a/Documentation/tex/mudela-book-doc.doc +++ b/Documentation/tex/mudela-book-doc.doc @@ -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 index 0000000000..f8a4f3b28f --- /dev/null +++ b/Documentation/tex/reference-manual.tely @@ -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 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' ~ +@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 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 + \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 + \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 + + + } +@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{ } + } + \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 { + + } + \context Thread \notes { + + } + > +@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 { + + } + \context Thread \notes { + + } + > +@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 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'' { + + } + } + +@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/reference-manual.yo b/Documentation/tex/reference-manual.yo deleted file mode 100644 index 0d17437b98..0000000000 --- a/Documentation/tex/reference-manual.yo +++ /dev/null @@ -1,3355 +0,0 @@ -mailto(gnu-music-discuss@gnu.org) -COMMENT(-*-text-*-) - -redef(var)(1)(\ - whenlatex(latexcommand({\normalfont\scshape )ARG1+latexcommand(}))\ - whenhtml(sc(ARG1))\ -) - -def(indexcode)(1)(cindex(ARG1@code(ARG1))) -def(indexandcode)(1)(code(ARG1)indexcode(ARG1)) -def(keyindex)(1)(cindex(ARG1@code(\ARG1))) - -redef(code)(1)(tt(ARG1)) -redef(cindex)(1)(\ - whenlatex(latexcommand(\index{)ARG1+latexcommand(}))\ - whentexinfo(XXnl()texinfocommand(@cindex )ARG1XXnl())\ -) - - -COMMENT( - BUGS: - - restStyle=mensural doesn't seem to work (lots of characters not found - for rests.fly) - - TODO: - - accordeon symbols - Music expression / music expression - property lists should be alphabetic. - -) - - -COMMENT( - This document contains Mudela fragments. You need at least - Yodl-1.30.18 to convert this to tex or html. -) - -htmlbodyopt(bgcolor)(white) -htmlcommand() - -latexlayoutcmds( - \setlength{\topmargin}{-0.25in} - \setlength{\textheight}{9in} - \setlength{\textwidth}{5.875in} - \setlength{\oddsidemargin}{0.25in} - \setlength{\evensidemargin}{0.25in} - \input mudela-book - \usepackage{makeidx} - \makeindex -) - -whentexinfo(notableofcontents()) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -article(LilyPond 1.2.0 Reference Manual) - (Adrian Mariano, Han-Wen Nienhuys and Jan Nieuwenhuizen) - (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) - - -latexcommand(\def\interexample{}) -latexcommand(\def\preexample{\par}) -latexcommand(\def\postexample{\par\medskip}) -latexcommand(\def\file#1{{code(#1)}}) -COMMENT( - latexcommand(\def\texttt#1{\tt #1}) - latexcommand(\def\textbf#1{\bf #1}) -) - -COMMENT(urg, texinfo include breaks) -whenhtml(includefile(html-disclaimer.yo-urg)) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Overview) - -This nop(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 em(Music -Definition Language) or em(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.) - -em(Mudela) is a language that allows you to - -itemize( - it() create musical expressions by combining pitches, durations - it() output those musical expressions to various formats - it() give those musical expressions and output definitions names, so - you can enter them in manageable chunks. -) - -em(Mudela) aims to define a piece of music completely, both from -typesetting and from a performance point of view. - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Top level) -cindex(top level) - -This section describes what you may enter at top level. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Score definitions) -cindex(score definition) - -The output is generated combining a music expression with an output -definition. A score block has the following syntax: - -quote( - code(\score {) var(musicexpr) var(outputdefs) code(}) -) - -var(outputdefs) are zero or more output definitions. If no output -definition is supplied, the default code(\paper) block will be added. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Information header) -cindex(header) -keyindex(header) - -The syntax is - -quote( - code(\header) code({) var(key1) = var(val1); - var(key2) = var(val2); ellipsis() code(}) -) - -A header describes the file's contents. It can also appear in a -code(\score) block. Tools like indexandcode(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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Setting notenames and chordnames) -label(notenames) - -Note name tables can be specified using - -quote( - code(\notenames)keyindex(notenames) - code({) var(assignmentlist) code(}) -) - -var(assignmentlist) is a list of definitions of the form - -quote( - var(name) = var(pitch) -) - -Chord modifiers can be set analogously, with -code(\chordmodifiers)keyindex(chordmodifiers). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Output definitions) - -A code(\paper) block at top level sets the default paper block. A -code(\midi) block at top level works similarly. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(GUILE and Scheme) - -LilyPond contains a Scheme interpreter (the GUILE library) for -internal use. The following commands access the interpreter -directly. - -quote( - code(\scm)keyindex(scm) var(scheme) code(;) -) - -Evaluates the specified Scheme code. The result is discarded. - -quote( - code(\scmfile)keyindex(scmfile) var(filename) code(;) -) - -Reads Scheme code from the specified file. The result is discarded. - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Identifiers) - -Identifier assignments may appear at top level. Semicolons are -forbidden after top level assignments. - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Lexical conventions) -cindex(lexical conventions) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Comments) -cindex(comment) -indexcode(%) -whenlatex(cindex(%A@latexcommand(\texttt{\%\textbraceleft}))) -whenlatex(cindex(%B@latexcommand(\texttt{\%\textbraceright}))) - -A one line comment is introduced by a `code(%)' character. -Block comments are started by `code(%{)' and ended by `code(%})'. -They cannot be nested. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Keywords) -cindex(keyword) - -Keywords start with a backslash, followed by a number of lower case -alphabetic characters. These are all the keywords. - -latexcommand(\begin{raggedright}) -quote( - 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) -) -latexcommand(\end{raggedright}) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Integers) -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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Reals) -cindex(real) - -Formed from an optional minus sign and a sequence of digits followed -by a em(required) decimal point and an optional exponent such as -code(-1.2e3). Reals can be built up using the usual operations: -`indexandcode(+)', `indexandcode(-)', `indexandcode(*)', and -`indexandcode(/)', with parentheses for grouping. - -A real constant can be followed by one of the dimension -keywords:cindex(dimensions) code(\mm)keyindex(mm), -code(\pt)keyindex(pt), code(\in)keyindex(in), or -code(\cm)keyindex(cm), for millimeters, points, inches and -centimeters, respectively. This converts the number to a real that -is the internal representation of dimensions. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(String) -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 bind(section)ref(modes) for details on unquoted strings; their -interpretation varies depending on the situation. Strings can be -concatenated with the `code(+)' operator. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Tokenizer commands) - -The tokenizer accepts the following commands. They can appear -anywhere. - -quote( - code(\maininput)keyindex(maininput) -) - -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. - -quote( - code(\include)keyindex(include) var(file) -) - -Include var(file). The argument var(file) 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, - -quote( - code(\version)keyindex(version) var(string) code(;) -) - -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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Pitch Names in Other Languages) -cindex(other languages) -label(notelang) - -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: - -quote( -verb( 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) -) - -Pitch names can be redefined using the -code(\notenames)keyindex(notenames) command, see -bind(subsection)ref(notenames). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Lexical modes) -cindex(lexical modes) -cindex(modes) -label(modes) - -To simplify entering notes, lyrics, and chords, em(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. - -description( - dit(Normal mode.)cindex(mode!normal) - At the start of parsing, em(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. - - dit(Note mode.)cindex(mode!note) - - Note mode is introduced by the keyword - code(\notes)keyindex(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. - - dit(Chord mode.)cindex(mode!chord) - Chord mode is introduced by the keyword - code(\chords)keyindex(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. - - dit(Lyrics mode.) cindex(mode!lyric) - - Lyrics mode is introduced by the keyword - code(\lyrics)keyindex(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(). - -COMMENT( -DOEXPAND(muckslash)^etre % a word -) - - quote( -verb(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) - ) - - Since combinations of numbers and dots are used for indicating - durations, you can not enter real numbers in this mode. -) - -It is possible to create words that break the rules by prefixing them -with the dollar sign `indexandcode($)'. 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.) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Types) -cindex(types and identifiers) - -em(Mudela) has a limited set of types: - -itemize( - it() integers - it() reals - it() strings - it() music expressions - it() durations of notes and rests (specified with - code(\notenames)keyindex(notenames)) - it() note name tables - it() context definitions, part of output definitions. See - bind(section)ref(contextdefs) for more information - it() output definitions (like code(\paper)keyindex(paper) blocks - and code(\midi)keyindex(midi) blocks) - it() score definitions (code(\score)keyindex(score) blocks) -) - -Type is a syntactical property: em(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)keyindex(paper) block) will yield a ``parse -error''. - -Identifiers allow objects to be assigned to names. To assign an -identifier, you use `var(name)=var(value)' and to refer to an -identifier, you preceed its name with a backslash: -`code(\)var(name)'. Identifier assignments must appear at top level -in the em(Mudela) file. Semicolons are forbidden after assignments -appearing at top level but they are obligatory after assignments -appearing in the code(\paper) block, see bind(Section)ref(paper). - -var(value) 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. - -quote( - code(foo = \foo * 2.0) -) - -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)keyindex(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.) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Music expressions) -cindex(music expressions) - -Music in em(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: - -quote( - verb(\sequential { c4 d4 }) -) - -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 -bind(subsection)ref(atomicmusic). Compound music expressions are -discussed in bind(subsection)ref(compoundmusic). - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Atomic music expressions) -label(atomicmusic) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Pitch and duration) -cindex(pitch) -cindex(duration) - -The syntax for pitch specification is - -quote( - code(\musicalpitch)keyindex(musicalpitch) - code({) var(octave) var(note) var(shift) code(}) -) - -var(octave) is specified by an integer, zero for the octave -containing middle C. var(note) 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 -bind(section)ref(notelang) for pitch names in different languages. - -The syntax for duration specification is - -quote( - code(\duration)keyindex(duration) - code({) var(length) var(dotcount) code(}) -) - -var(length) is the negative logarithm (base 2) of the duration: -bind(1)is a half note, bind(2)is a quarter note, bind(3)is an eighth -note, etc. The number of dots after the note is given by -var(dotcount). - -In Note, Chord, and Lyrics mode, durations may be designated by -numbers and dots. See bind(Section)ref(notelang) for details. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Note specification) -label(notedesc) -cindex(note specification) -cindex(pitches) -cindex(entering notes) - -A note specification has the form - -quote( - var(pitch)[var(octavespec)][code(!)][code(?)][var(duration)] -) - -The pitch of the note is specified by the note's name. - -subsubsect(Pitches) - -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 -bind(section)ref(notelang) for details. - -subsubsect(Octaves) - -The optional octave specification takes the form of a series of -single quote (`indexandcode(')') characters or a series of comma -(`indexandcode(,)') 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'') - -mudela(fragment,verbatim,center)( cis' dis' eis' fis' gis' ais' bis') - -mudela(fragment,verbatim,center)( ces' des' es' fes' ges' as' bes') - -mudela(fragment,verbatim,center)( cisis' eisis' gisis' aisis' beses') - -mudela(fragment,verbatim,center)( ceses' eses' geses' ases' beses') - -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 `indexandcode(?)' after the pitch. - -mudela(fragment,verbatim,center)( cis' d' e' cis' c'? d' e' c'!) - -subsubsect(Duration) -cindex(duration) - -Durations are entered as their reciprocal values. For notes longer -than a whole note, use identifiers. - -quote( -verb(c'\longa c'\breve -c'1 c'2 c'4 c'8 c'16 c'32 c'64 c'64) -) - -quote( -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"; - } - } -}) -) - -quote( -verb(r\longa r\breve -r1 r2 r4 r8 r16 r32 r64 r64) -) - -quote( -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"; - } - } -}) -) - -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 (`indexandcode(.)') -to obtain dotted note lengths. - -mudela(fragment,verbatim,center)( a'4. b'4.) - -You can alter the length of duration by writing -`code(*)var(fraction)' after it. This will not affect the -appearance of note heads or rests. - -subsubsect(Rests) - -Rests are entered like notes, with note name `indexandcode(r)', -or `indexandcode(R)'. There is also a note name `indexandcode(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. - -subsubsect(Lyrics syllables) -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 -bind(section)ref(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 bind(section)ref(lyricprint). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Properties) -cindex(properties) - -quote( - code(\property)keyindex(property) - var(contextname)code(.)var(propname) code(=) var(value) -) - -Sets the var(propname) property of the context var(contextname) to -the specified var(value). All three arguments are strings. -Depending on the context, it may be necessary to quote the strings or -to leave space on both sides of the dot. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Translator switches) -cindex(translator switches) - -quote( - code(\translator)keyindex(translator) - var(contexttype) = var(name) -) - -A music expression indicating that the context which is a direct -child of the a context of type var(contexttype) should be shifted to -a context of type var(contexttype) and the specified name. - -Usually this is used to switch staffs in Piano music, e.g. - -quote( - code(\translator Staff = top) var(Music) -) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Commands) -cindex(commands) - -Commands are music expressions that have no duration. - -subsubsect(Key signatures) - -quote( - code(\key)keyindex(key) var(pitch) var(type) code(;) -) - -Change the key signature. var(type) should be -code(\major)keyindex(major) or code(\minor)keyindex(minor) to get -var(pitch)-major or var(pitch)-minor, respectively. The second -argument is optional; the default is major keys. The var(\context) -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)keyindex(key) commands to get the corresponding major key, -e.g., code(\minor)keyindex(minor) is defined bind(as)3. The standard -mode names code(\ionian)keyindex(ionian), -code(\locrian)keyindex(locrian), code(\aeolian)keyindex(aeolian), -code(\mixolydian)keyindex(mixolydian), code(\lydian)keyindex(lydian), -code(\phrygian)keyindex(phrygian), and code(\dorian)keyindex(dorian) -are also defined. - -quote( - code(\keysignature)keyindex(keysignature) var(pitchseq) code(;) -) - -Specify an arbitrary key signature. The pitches from var(pitch) will -be printed in the key signature in the order that they appear on the -list. - -subsubsect(Rehearsal marks) - -quote( - code(\mark)keyindex(mark) var(unsigned) code(;) nl() - code(\mark) var(string) code(;) -) - -Prints a mark over or under (depending on the -indexandcode(markDirection) property) the staff. You must add -indexandcode(Mark_engraver) to either the Score or Staff context for -this to work. - -subsubsect(Bar lines) -label(barlines) - -quote( - code(\bar)keyindex(bar) var(bartype) code(;) -) - -This is a request to print a special bar symbol. It replaces the -regular bar symbol with a special -symbol. The argument var(bartype) 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 var(bartype) 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 bind(section)ref(sec:repeats). - -subsubsect(Timing commands) - -quote( - code(\cadenza)keyindex(cadenza) var(togglevalue) code(;) -) - -Music expression that toggles the automatic generation of bar lines. -If var(togglevalue) bind(is)1, bar line generation is turned off. If -var(togglevalue) bind(is)0, a bar line is immediately printed and -automatic bar generation is turned on. - -quote( - code(\time)keyindex(time) var(numerator)code(/)var(denominator) code(;) -) - -Change the time signature. The default time signature bind(is)4/4. -The time signature is used to generate bar lines. - -quote( - code(\tempo)keyindex(tempo) var(duration) = var(perminute) code(;) -) - -Used to specify the tempo. For example, `code(\tempo 4 = 76;)' -requests output with bind(76)quarter notes per minute. - -quote( - code(\partial)keyindex(partial) var(duration) code(;) -) -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. - -quote( - code(|)indexcode(|)cindex(bar check) -) -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. - -subsubsect(Other commands) - -quote( - code(\penalty)keyindex(penalty) var(int) code(;) -) - -Discourage or encourage line breaks. See identifiers -code(\break)keyindex(break) and code(\nobreak)keyindex(nobreak) in -bind(section)ref(ident). - -quote( - code(\clef)keyindex(clef) var(clefname) code(;) -) - -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 bind(middle)C shown in each -clef: - -quote( -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\\texttt{\\_}8" - } - \paper { - linewidth = 4.5 \in; - } -}) -) - -quote( -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; - } -}) -) - -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)'. - -quote( - code(\skip)keyindex(skip) var(duration) code(;) -) - -Skips the amount of time specified by var(duration). 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)'. - -subsubsect(Beams) -cindex(beams) -label(manualbeam) - -A beam is specified by surrounding the beamed notes with brackets -`indexandcode([)' and `indexandcode(])'. - -mudela(fragment,verbatim,center)( [a'8 a'] [a'16 a' a' a']) - -Some more elaborate constructions: - -mudela(fragment,verbatim,center)( [a'16 c'' ] - \times 2/3 { [e'8 f' g'] }) - -Beaming can be generated automatically; see bind(section)ref(autobeam). - -To place tremolo marks cindex(tremolo beams) between two notes, begin -with `code([:)var(length)' 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(:)var(length)' to the note itself -(see also bind(section)ref(tremolo)). - -mudela(fragment,verbatim,center)( [:16 e'1 g'] [:8 e'4 f']) - -mudela(fragment,verbatim,center)( c'4:32 [:16 c'8 d'8]) - -subsubsect(Lyric helpers) -cindex(--@code(-)code(-)) -indexcode(__) -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(-)'. - -subsubsect(Ties) -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 `indexandcode(~)'. -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' ~ ) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Atomic music expressions: add-ons) - -[TODO: explain Requests] - -subsubsect(Articulations) -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 `var(note)code(-\)var(name)'. 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 -`var(note)code(^\)var(name)' and `var(note)code(_\)var(name)' -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; - } - } -) - -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 bind(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; - } - } -) - -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)keyindex(ppp), -code(\pp)keyindex(pp), code(\p)keyindex(p), code(\mp)keyindex(mp), -code(\mf)keyindex(mf), code(\f)keyindex(f), code(\ff)keyindex(ff), -code(\fff)keyindex(fff), code(\fff)keyindex(ffff), -code(\fp)keyindex(fp), code(\sf)keyindex(sf), -code(\sff)keyindex(sff), code(\sp)keyindex(sp), -code(\spp)keyindex(spp), code(\sfz)keyindex(sfz), and -code(\rfz)keyindex(rfz). - -subsubsect(General text scripts) - -quote( - code(\textscript)keyindex(textscript) var(text) var(style) -) - -Defines a text to be printed over or under a note. var(style) 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: - -quote( -verb(c4-\textscript "6" "finger" -c4-\textscript "foo" "normal") -) - -This is equivalent to `code(c4-6 c4-"foo")'. - -subsubsect(General scripts) -cindex(scripts) - -quote( - code(\script)keyindex(script) var(alias) -) - -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)keyindex(script) keyword is not used directly. Various -helpful identifier definitions appear in file(script.ly). - -subsubsect(Slurs) -cindex(slur) - -Slurs connects chords and try to avoid crossing stems. A slur is -started with `code(CHAR(40))' and stopped with `code(CHAR(41))'. The -starting `code(CHAR(40))' appears to the right of the first note in -the slur. The terminal `code(CHAR(41))' 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) - -subsubsect(Crescendo) -cindex(crescendo) - -A crescendo mark is started with code(\cr)keyindex(cr) and terminated -with code(\rc)keyindex(rc). A decrescendo mark is started with -code(\decr)keyindex(decr) and terminated with -code(\rced)keyindex(rced). There are also shorthands for these -marks. A crescendo can be started with code(\<)keyindex(<) and a -decrescendo can be started with code(\>)keyindex(>). Either one can -be terminated with code(\!)keyindex("!). 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 } >) - -subsubsect(General spanners) - -quote( - code(\spanrequest)keyindex(spanrequest) var(startstop) var(type) -) - -Define a spanning request. The var(startstop) parameter is bind(either)-1 -(code(\start)keyindex(start)) bind(or)1 (code(\stop)keyindex(stop)) and -var(type) is a string that describes what should be started. -Supported types are code(crescendo), code(decrescendo), -code(beam), code(slur). This is an internal command. Users should -use the shorthands which are defined in the initialization file -file(spanners.ly). - -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") - -The slur syntax with parentheses is a shorthand for this. - -COMMENT(came till here with indexifying) - -subsubsect(Tremolo marks) -cindex(tremolo marks) -label(tremolo) - -Tremolo marks can be printed on a single note by adding -`code(:)[var(length)]' after the note. The length must be at -bind(least)8. A var(length) value bind(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 indexandcode(abbrev) property if there was -no last value. - -mudela(verbatim,fragment,center)( c'2:8 c':32) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Compound music expressions) -cindex(compound music expressions) -label(compoundmusic) - -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 b c'}{c' d' e'}> - }) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Context selection) -cindex(context selection) - -quote( - code(\context)keyindex(context) - var(contexttype) [code(=) var(contextname)] var(musicexpr) -) - -Interpret var(musicexpr) within a context of type var(contexttype). -If the context does not exist, it will be created. The new context -can optionally be given a name. See -bind(section)ref(contextselection) bind(and)ref(contextdefs) for more -information on interpretation contexts. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Music entry modes) -cindex(input modes) -cindex(mode switch) - -Mode switching keywords form compound music expressions: code(\notes) -keyindex(notes) var(musicexpr), code(\chords) keyindex(chords) -var(musicexpr), and code(\lyrics) keyindex(lyrics) var(musicexpr). -These expressions do not add anything to the meaning of their -arguments. They are just a way to indicate that the arguments should -be parsed in indicated mode. See bind(section)ref(modes) for more -information on modes. - -More information on context selection can be found in -bind(section)ref(contextselection). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Sequential music) -cindex(sequential music) -COMMENT(It's not possible to index `{' and `}' directly, thus we - must construct it.) -whenlatex(cindex(?A@latexcommand(\texttt{\textbraceleft}))) -whenlatex(cindex(?B@latexcommand(\texttt{\textbraceright}))) - -quote( - code(\sequential)keyindex(sequential) - code({) var(musicexprlist) code(}) -) - -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: - -quote( - code({) var(musicexprlist) code(}) -) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Simultaneous music) -cindex(simultaneous music) -indexcode(<) -indexcode(>) - -quote( - code(\simultaneous)keyindex(simultaneous) - code({) var(musicexprlist) code(}) -) - -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: - -quote( - code(<) var(musicexprlist) code(>) -) - -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 - \paper { - linewidth = -1.; - } - }) - -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 - \paper { - linewidth = -1.; - } - }) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Relative Pitch Specification) -cindex(relative pitch specification) -label(relative) - -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. - -quote( - code(\relative)keyindex(relative) var(startpitch) var(musicexpr) -) - -The octave of notes that appear in var(musicexpr) are calculated as -follows: If no octave changing marks are used, the basic interval -between this and the last note is always taken to be a fourth or -less.footnote(The interval is determined without regarding -accidentals. A code(fisis) following a code(ceses) will be put above -the code(ceses).) The octave changing marks `code(')' and `code(,)' -can then be added to raise or lower the pitch by an extra octave. -Upon entering relative mode, an absolute starting pitch must be -specified that will act as the predecessor of the first note of -var(musicexpr). - -Entering scales is straightforward in relative mode. - -mudela(fragment,verbatim,center)( \relative c' { - c d e f g a b c c, - }) - -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'' }) - -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 - - - }) - -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)keyindex(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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Chord names) - -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 bind(section)ref(modes)). - -quote( - var(tonic)[var(duration)][code(-)var(modifiers)]\ - [code(^)var(subtractions)]\ - [code(/)var(inversion)]. -) - -var(tonic) should be the tonic note of the chord, and var(duration) -is the chord duration in the usual notation. There are two kinds of -modifiers. One type is em(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(.)'). - -quote( -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 - } -} -) -) - -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, `indexandcode(aug)' which -raises the 5th, `indexandcode(dim)' which lowers the 5th, -`indexandcode(maj)' which adds a raised 7th, and `indexandcode(sus)' -which replaces the 5th with a 4th. - -quote( -mudela(fragment,verbatim)(\transpose c'' { - \chords { - c1-m c-min7 c-maj c-aug c-dim c-sus - } -} -) -) - -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 - } - }) - -Chord inversions can be specified by appending `indexandcode(/)' 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 - } - } -) - -Throughout these examples, chords have been shifted around the staff -using code(\transpose). - -You should not combine code(\relative) with named chords. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Tuplets) -cindex(tuplets) - -Tuplets are made out of a music expression by multiplying their -duration with a fraction. - -quote( - code(\times)keyindex(times) var(fraction) var(musicexpr) -) - -The duration of var(musicexpr) will be multiplied by the fraction. -In print, the fraction's denominator will be printed over the notes, -optionally with a bracket. The most common tuplet is the triplet in -which bind(3)notes have the length bind(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) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Grace notes) -cindex(grace notes) - -quote( - code(\grace)keyindex(grace) var(musicexpr) -) - -A grace note expression has bind(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 -indexandcode(graceAlignPosition). - -When grace music is interpreted, a score-within-a-score is set up: -var(musicexpr) has its own time bookkeeping, and you could (for -example) have a separate time signature within grace notes. While in -this score-within-a-score, you can create notes, beams, slurs, etc. -Unbeamed eighth notes and shorter by default have a slash through the -stem. This behavior can be controlled with the -indexandcode(stemStyle) property. - -quote( -mudela(fragment,verbatim)(\relative c'' { - \grace c8 c4 \grace { [c16 c16] } c4 - \grace { \property Grace.stemStyle = "" c16 } c4 -} -) -) - -At present, nesting code(\grace)keyindex(grace) notes, e.g. - -quote( - code(\grace { \grace c32 c16 } c4) -) - -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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Repeats) -cindex(repeats) -label(sec:repeats) - -In order to specify repeats, use the code(\repeat)keyindex(repeat) -keyword. Since repeats look and sound differently when played or -printed, there are a few different variants of repeats. - -description( - dit(unfolded) nl() - Repeated music is fully written (played) out. Useful for MIDI - output. - - dit(volta) nl() - This is the normal notation: Repeats are not written out, but - alternative endings (voltas) are printed, left to right. - - dit(folded) nl() - Alternative endings are written stacked, which is useful for - lyrics. -) - -The syntax for repeats is - -quote( - code(\repeat) var(variant) var(repeatcount) var(repeatbody) -) - -If you have alternative endings, you may add - -quote( - code(\alternative)keyindex(alternative) - code({) var(alternative1) - var(alternative2) - var(alternative3) ellipsis() code(}) -) - -where each var(alternative) is a Music expression. - -Normal notation repeats are used like this: - -quote( -mudela(fragment,verbatim)( c'1 - \repeat volta 2 { c'4 d' e' f' } - \repeat volta 2 { f' e' d' c' } -) -) - -With alternative endings: - -quote( -mudela(fragment,verbatim)( c'1 - \repeat volta 2 {c'4 d' e' f'} - \alternative { {d'2 d'} {f' f} } -) -) - -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.) - -quote( -mudela(fragment,verbatim)( c'1 - \repeat fold 2 {c'4 d' e' f'} - \alternative { {d'2 d'} {f' f} } -) -) - -quote( -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 } } - } -} -) -) - -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. - -quote( -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 } } - } -} -) -) - -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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Transposition of Pitches) -cindex(transposition of pitches) -label(transpose) - -A music expression can be transposed with -code(\transpose)keyindex(transpose). The syntax is - -quote( - code(\transpose) var(pitch) var(musicexpr) -) - -This means that middle C in var(musicexpr) is transposed to -var(pitch). - -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. - -quote( -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 } -} -) -) - -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). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Automatic lyric durations) -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). -keyindex(addlyrics) The syntax for this is - -quote( - code(\addlyrics) var(musicexpr1 musicexpr2) -) - -This means that both var(musicexpr1) and var(musicexpr2) are -interpreted, but that every non-command atomic music expression -(``every syllable'') in var(musicexpr2) is interpreted using timing -of var(musicexpr1). - -If the property indexandcode(automaticMelismata) is set in the -context of var(musicexpr1), no lyrics will be put on slurred or tied -notes. - -quote( -mudela(verbatim,fragment)(\addlyrics -\transpose c'' { - \property Voice.automaticMelismata = "1" - c8 () cis d8. e16 f2 -} -\context Lyrics \lyrics { - do4 re mi fa } -) -) - -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: - -quote( -mudela(verbatim,fragment)(\addlyrics -\transpose c'' { - c8 () cis d8. e16 f2 -} -\context Lyrics \lyrics -< { do4 re mi fa } - { do8 re mi fa } > -) -) - -It is valid (but probably not very useful) to use notes instead of -lyrics for var(musicexpr2). - -COMMENT( - mudela(verbatim,fragment)( - \context Voice \addlyrics - { s4 s8 s16 s32 } - { [c16 c c c] } - ) -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Ambiguities) -cindex(ambiguities) - -The grammar contains a number of ambiguities.footnote(The authors -hope to resolve them at a later time.) - -itemize( - it() The assignment - - quote( - verb(foo = bar) - ) - - can be interpreted as making a string identifier code(\foo) - containing code("bar"), or a music identifier code(\foo) - containing the syllable `bar'. - - it() The assignment - - quote( - verb(foo = -6) - ) - - can be interpreted as making an integer identifier - bind(containing)-6, or a Request identifier containing the - bind(fingering)`6' (with neutral direction). - - it() If you do a nested repeat like - - quote( -verb(\repeat ... -\repeat ... -\alternative) - ) - - 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. - - it() (an as yet unidentified ambiguity :-) -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Notation conversion specifics) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Automatic Beam Generation) -cindex(automatic beam generation) -label(autobeam) - -By default, LilyPond will generate beams automatically. This feature -can be disabled by setting the indexandcode(Voice.noAutoBeaming) -property bind(to)1. It can be overridden for specific cases by -specifying explicit beams as described in -bind(section)ref(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 indexandcode(Voice.beamAutoEnd) property. To end beams every -quarter note, for example, you could set -indexandcode(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 -indexandcode(Voice.beamAutoBegin). - -To allow different settings for different time signatures, these -property names can start with `code(time)var(N)code(_)var(M)' to -restrict the definition to `var(N)code(/)var(M)' time. For example, -to specify beams ending only for bind(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 -bind(32nd)notes, you would use code(Voice.beamAutoEnd_32). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Printing chord names) -cindex(chord names) -cindex(chords) -cindex(printing!chord names) - -For displaying printed chord names, use the indexandcode(ChordNames) -and indexandcode(ChordNameVoice) contexts. The chords may be entered -either using the notation described above, or directly using -simultaneous music. - -quote( -mudela(fragment,verbatim)(< - \context ChordNames { - \chords{a b c} \notes{ } - } - \context Staff \notes { - a b c' d' e' - } -> -) -) - -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 { - - } - \context Thread \notes { - - } - >) - -If you want inversions to be recognized, you must set the property -indexandcode(ChordNames.chordInversion): - -mudela(fragment,verbatim,center)( < - \property Score.chordInversion = 1 - \context ChordNameVoice \notes { - - } - \context Thread \notes { - - } - >) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Printing lyrics) -cindex(lyrics) -cindex(printing!lyrics) -label(lyricprint) - -Lyric syllables must be interpreted within a code(Lyrics) context -cindex(context!Lyrics) for printing them. - -Here is a full example: - -quote( -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 - } - > -} -) -) - -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(_)'). - -quote( -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 __ - } - > -} -) -) - -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: - -quote( -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 - } - > -} -) -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(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( - it() What notes are playing at this point? - it() What symbols will be printed at this point? - it() In what style will they printed? - it() What is the current key signature, time signature, point within - the measure, etc.? -) - -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 em(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: - -quote( - verb(\score { \notes < c4 > }) -) - -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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Context selection) -label(contextselection) -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) var(name) var(musicexpr)' expression is encountered -during the interpretation phase, the var(musicexpr) argument will be -interpreted with a context of type var(name). 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, - -quote( -mudela(verbatim)(\score { - \notes \relative c'' { - c4 f - } -} -) -) - -In this example, the code(c) bind(and)code(d) are printed on the -default staff. For bind(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 bind(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 - -quote( - code(\keyword) var(musicexpr1) var(musicexpr2) ellipsis() -) - -When the interpretation of this music expression starts, the context -for var(musicexpr1), var(musicexpr2), etc. is that of the total -expression. - -Lastly, you may wonder, why this: - -quote( -verb(\score { - \notes \relative c'' { - c4 d4 e4 - } -}) -) - -doesn't result in this: - -mudela()( - \score { - \notes \relative c'' { - - } - } -) - -For bind(the)code(c4), a default code(Staff) (with a contained -code(Voice)) context is created. After bind(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 bind(the)code(c4) ends, the context of the -sequential music is also the default code(Voice) context. -bind(The)code(d4) gets interpreted in the same context -bind(as)code(c4). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Predefined contexts) - -These are the contexts supplied with the package. They are defined -in the initialization file file(ly/engraver.ly). - -description( - dit(code(Grace))indexcode(Grace) nl() - 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. - - dit(code(LyricVoice))indexcode(LyricVoice) nl() - Corresponds to a voice with lyrics. Handles the printing of a - single line of lyrics. - - dit(code(Thread))indexcode(Thread) nl() - 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. - - dit(code(Voice))indexcode(Voice) nl() - 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. - - dit(code(ChordNamesVoice))indexcode(ChordNamesVoice) nl() - A voice with chord names. Handles printing of a line of chord - names. - - dit(code(ChordNames))indexcode(ChordNames) nl() - Typesets chord names. Can contain code(ChordNamesVoice) - contexts. - - dit(code(Lyrics))indexcode(Lyrics) nl() - Typesets lyrics. It can contain code(LyricVoice) contexts. - - dit(code(Staff))indexcode(Staff) nl() - Handles clefs, bar lines, keys, accidentals. It can contain - code(Voice) contexts. - - dit(code(RhythmicStaff))indexcode(RhythmicStaff) nl() - 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. - - dit(code(GrandStaff))indexcode(GrandStaff) nl() - 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. - - dit(code(PianoStaff))indexcode(PianoStaff) nl() - Just like code(GrandStaff) but with code(minVerticalAlign) set - equal to code(maxVerticalAlign) so that interstaff beaming and - slurring can be used. - - dit(code(StaffGroup))indexcode(StaffGroup) nl() - 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. - - dit(code(ChoirStaff))indexcode(ChoirStaff) nl() - Identical to code(StaffGroup) except that the contained staffs - are not connected vertically. - - dit(code(Score))indexcode(Score) nl() - 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. -) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Context properties) - -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 - -quote( - var(propname) code(=) var(value) -) - -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 em(translators). Translators for -notation are called em(engravers), and translators for sound are -called em(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. - -subsubsect(Lyrics properties) -cindex(properties!Lyrics) - -description( - dit(code(textStyle))indexcode(textStyle) nl() - 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. -) - -subsubsect(Thread properties) -cindex(properties!Thread) - -description( - dit(code(noteheadStyle))indexcode(noteheadStyle) nl() - 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.; - } - } - ) -) - -subsubsubsect(Grace properties) -cindex(properties!Grace) - -description( - dit(indexandcode(stemStyle)) nl() - 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. -) - -subsubsect(Voice properties) -cindex(properties!Voice) - -description( - dit(code(abbrev))indexcode(abbrev) nl() - Set length for tremolo to be used if no length is explicitly - specified. - - dit(code(articulationScriptPadding))indexcode(articulationScriptPadding) - nl() - 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. - - dit(code(articulationScriptVerticalDirection)) - indexcode(articulationScriptVerticalDirection) nl() - 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. - - dit(code(noAutoBeaming))indexcode(beamAuto) nl() - If set bind(to)1 then beams are not generated automatically. - - dit(code(beamAutoEnd))indexcode(beamAutoEnd) nl() - Specifies when automatically generated beams can end. See - bind(section)ref(autobeam). - - dit(code(beamAutoBegin))indexcode(beamAutoBegin) nl() - Specifies when automatically generated beams can start. See - bind(section)ref(autobeam). - - dit(code(beamquantisation))indexcode(beamquantisation) nl() - 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)keyindex(beamposfree), - code(\beamposnormal)keyindex(beamposnormal), and - code(\beampostraditional)keyindex(beampostraditional). - - dit(code(beamslopedamping))indexcode(beamslopedamping) nl() - 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)keyindex(beamslopeproportional), - code(\beamslopedamped)keyindex(beamslopedamped), and - code(\beamslopezero)keyindex(beamslopezero) each set the - corresponding value. - - dit(code(dynamicDirection))indexcode(dynamicDirection) nl() - 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. - - dit(code(dynamicStyle))indexcode(dynamicStyle) nl() - Set the text style for dynamics. - - dit(code(fontSize))indexcode(fontSize) nl() - Can be used to select smaller font sizes for music. The normal - font size bind(is)0, and the two smaller sizes are -1 - bind(and)-2. - - - dit(code(forceHorizontalShift))indexcode(forceHorizontalShift) nl() - 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. - - - dit(code(horizontalNoteShift))indexcode(horizontalNoteShift) nl() - 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)keyindex(shift) is defined to - enable this. Traditionally, the outer chords (the upmost and - downmost voices), should have no code(horizontalNoteShift). - - dit(code(markScriptPadding))indexcode(markScriptPadding) nl() - Determines the extra space added between the mark and the closest - staff line or note. - - dit(code(markDirection))indexcode(markDirection) nl() - 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. - - dit(code(midiInstrument))indexcode(midiInstrument) nl() - 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 bind(section)ref(midilist). If you use a string which - is not listed, LilyPond will silently substitute piano. - - - dit(code(oldTieBehavior))indexcode(oldTieBehavior) nl() - Set bind(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. - - dit(code(restStyle))indexcode(restStyle) nl() - 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. - - dit(code(scriptHorizontal))indexcode(scriptHorizontal) nl() - Put scripts left or right of note heads. Support for this is - limited. Accidentals will collide with scripts. - - dit(code(slurVerticalDirection))indexcode(slurVerticalDirection) nl() - 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)keyindex(slurup), - code(\slurdown)keyindex(slurdown), and - code(\slurboth)keyindex(slurboth) are available. - - - dit(code(slurDash))indexcode(slurDash) nl() - Set bind(to)0 for normal slurs, bind(1)for dotted slurs, and a - larger value for dashed slurs. Identifiers - code(\slurnormal)keyindex(slurnormal) and - code(\slurdotted)keyindex(slurdotted) are predefined to set the - first two settings. - -dit(code(stemLength))indexcode(stemLength) nl() - Set length of stems. Unit is `code(interline)/2', so - code(stemLength) defaults bind(to)7. - - dit(code(stemLeftBeamCount))indexcode(stemLeftBeamCount) nl() - 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. - - dit(code(stemRightBeamCount))indexcode(stemRightBeamCount) nl() - 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. - dit(code(tieVerticalDirection))indexcode(tieVerticalDirection) nl() - 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. - - dit(code(transposing))indexcode(transposing) nl() - Transpose the MIDI output. Set this property to the number of - half-steps to transpose by. - - - dit(code(textEmptyDimension))indexcode(textEmptyDimension) nl() - If set bind(to)1 then text placed above or below the staff is - assumed to have zero width. - - dit(code(textStyle))indexcode(textStyle) nl() - Set the text style for superscripts and subscripts. See above - for list of text styles. - - dit(code(textScriptPadding))indexcode(textScriptPadding) nl() - Determines the extra space added between superscripted resp. - subscripted text and the closest staff line or note. - - dit(code(verticalDirection))indexcode(verticalDirection) nl() - 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)keyindex(stemdown), code(\stemup)keyindex(stemup), - and code(\stemboth)keyindex(stemboth) identifiers set this - property. - - - dit(code(tupletDirection))indexcode(tupletDirection) nl() - 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. - - dit(code(tupletVisibility))indexcode(tupletVisibility) nl() - Determines whether tuplets of notes are labelled. Setting - bind(to)0 shows nothing; setting bind(to)1 shows a number; - setting bind(to)2 shows a number and a bracket if there is no - beam; setting bind(to)3 shows a number, and if there is no beam - it adds a bracket; setting bind(to)4 shows both a number and a - bracket unconditionally. - -) - -subsubsubsect(Staff properties) -cindex(properties!Staff) - -description( - - dit(code(barNonAuto))indexcode(barNonAuto) nl() - If set bind(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. - - dit(code(barNumberDirection))indexcode(barNumberDirection) nl() - Set to code(\up) or code(\down) to put bar numbers above or below - the staff. - - dit(code(barNumberHangOnClef))indexcode(barNumberHangOnClef) nl() - Set bind(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. - - dit(code(barNumberScriptPadding))indexcode(barNumberScriptPadding) nl() - Sets extra space between the bar number and the bar it labels. - - dit(code(barSize))indexcode(barSize) nl() - Specify the height of the bar lines if it should be different - than the staff height. - - dit(code(barAtLineStart))indexcode(barAtLineStart) nl() - Set bind(to)1 to produce a bar line after the clef at the start - of each line (but not at the beginning of the music). - - dit(code(clefStyle))indexcode(clefStyle) nl() - 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. - - dit(code(createKeyOnClefChange))indexcode(createKeyOnClefChange) nl() - 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. - - dit(code(createInitdefaultClef))indexcode(createInitdefaultClef) nl() - Specify whether clefs are created on default? (Doesn't seem to - do anything.) - - dit(code(defaultClef))indexcode(defaultClef) nl() - Determines the default clef. See code(\clef) keyword. - - dit(code(markHangOnClef))indexcode(markHangOnClef) nl() - Set bind(to)1 to cause marks to appear by clefs instead of by bar - lines. Deprecated, use is not recommended. - - dit(code(marginDirection))indexcode(marginDirection) nl() - Set to code(\left) or code(\right) to specify location of - marginal scripts. - - dit(code(marginScriptPadding))indexcode(marginScriptPadding) nl() - Specify extra space for marginal scripts. - - dit(code(forgetAccidentals))indexcode(forgetAccidentals) nl() - Causes accidentals to be printed at every note instead of - remembered for the duration of a measure. - - dit(code(noResetKey))indexcode(noResetKey) nl() - 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. - - dit(code(staffLineLeading))indexcode(staffLineLeading) nl() - Specifies the distance (in points) between lines of the staff. - - dit(code(numberOfStaffLines))indexcode(numberOfStaffLines) nl() - Specifies the number of staff lines. The default bind(is)5. - - dit(code(postBreakPadding))indexcode(postBreakPadding) nl() - Extra space in points to be added after the clef, time signature - and key signature on the staff. Deprecated, do not use. - - dit(code(noVoltaBraces))indexcode(noVoltaBraces) nl() - Set to true to suppress the printing of brackets over alternate - endings specified by the command code(\alternative). - - dit(code(numberOfStaffLines))indexcode(numberOfStaffLines) nl() - Sets the number of lines that the staff has. - - dit(code(barAlways))indexcode(barAlways) nl() - If set bind(to)1 a bar line is drawn after each note. - - dit(code(defaultBarType))indexcode(defaultBarType) nl() - Sets the default type of bar line. See bind(Section)ref(barlines) - for a list of available bar types. - - dit(code(instrument), code(instr)) - indexcode(instrument)indexcode(instr) nl() - 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. - - dit(code(keyOctaviation))indexcode(keyOctaviation) nl() - If set bind(to)1, then keys are the same in all octaves. If set - bind(to)0 then the key signature for different octaves can be - different and is specified independently: - - quote( - code(\keysignature bes fis') - ) - - The default value bind(is)1. Can be set to zero with - code(\specialkey) or reset bind(to)1 with code(\normalkey). - - dit(code(timeSignatureStyle))indexcode(timeSignatureStyle) nl() - Changes the default two-digit layout for time signatures. The - following values are recognized: - - description( - dit(code(C))indexcode(C) nl() - 4/4 and 2/2 are typeset as C and struck C, respectively. All - other time signatures are written with two digits. - - dit(code(old))indexcode(old) nl() - 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. - - dit(code(1))indexcode(1) nl() - All time signatures are typeset with a single - digit, e.g. 3/2 is written bind(as)3. - - dit(indexcode(CM/N)code(C)var(M)code(/)var(N), - indexcode(oldM/N)code(old)var(M)code(/)var(N) or - indexandcode(old6/8alt)) nl() - Tells LilyPond to use a specific symbol as time signature. - ) - - 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; - } - } - ) - - dit(code(voltaSpannerDuration))indexcode(voltaSpannerDuration) nl() - 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). -) - -subsubsect(GrandStaff properties) -cindex(properties!GrandStaff) - -description( - dit(code(alignmentReference))indexcode(alignmentReference) nl() - 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. - - dit(code(maxVerticalAlign))indexcode(maxVerticalAlign) nl() - Set the maximum vertical distance between staffs. - - dit(code(minVerticalAlign))indexcode(minVerticalAlign) nl() - Set the minimum vertical distance between staffs. -) - -subsubsect(Score properties) -cindex(properties!Score) - -description( - dit(code(skipBars))indexcode(skipBars) nl() - Set bind(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. - - quote( -mudela(fragment,verbatim,center)\ - (r1 r1*3 R1*3\property Score.skipBars=1 r1*3 R1*3 -) - ) -) - -subsubsect(ChordNamesVoice properties) -cindex(properties!ChordNamesVoice) - -description( - dit(code(chordInversion))indexcode(chordInversion) nl() - Determines whether LilyPond should look for chord inversions when - translating from notes to chord names. Set bind(to)1 to find - inversions. The default bind(is)0 which does not look for - inversions. -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Notation output definitions) -cindex(output) -cindex(notation output) -cindex(output definition) -label(output) -label(paper) - -The most important output definition is the code(\paper) block, for -music notation. The syntax is - -quote( - code(\paper {) [var(paperidentifier)] var(items) code(}) -) - -where each of the items is one of - -itemize( - it() An assignment. The assignment must be terminated by a - semicolon. See bind(section)ref(papervars) for information on - paper variables. - - it() A context definition. See bind(section)ref(contextdefs) for - more information on context definitions. - - it() A margin shape declaration. The syntax is - - quote( - code(\shape) var(indent1)code(,) var(width1)code(,) - var(indent2)code(,) var(width2) ellipsis() code(;) - ) - keyindex(shape) - - Each pair of var(indent) and var(width) values is a dimension - specifying how far to indent and how wide to make the line. - The indentation and width of successive lines are specified by - the successive pairs of dimensions. The last pair of - dimensions will define the characeristics of all lines beyond - those explicitly specified. - - it() A font declaration. Its syntax is - - quote( - var(fontsize) code(=) code(\font)keyindex(font) var(fontname) - ) - - var(fontsize) is an integer describing the font to be used. - bind(0)is the default font. var(fontname) is the basename of - a font (usually a member of the Feta family). -) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Changing Font Size and Paper Size) -cindex(changing font size and paper size) - -The Feta font provides musical symbols at six different sizes. These -fonts are bind(11)point, bind(13)point, bind(16)point, bind(20)point, -bind(23)point, and bind(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 bind(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 -indexandcode(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 bind(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. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Paper variables) -cindex(paper variables) -label(papervars) - -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: - -description( - dit(code(indent))indexcode(indent) nl() - The indentation of the first line of music. - - dit(code(interline))indexcode(interline) nl() - 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. - - dit(code(linewidth))indexcode(linewidth) nl() - Sets the width of the lines. If set bind(to)-1.0, a single - unjustified line is produced. - - dit(code(output))indexcode(output) nl() - 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. - - dit(code(rulethickness))indexcode(rulethickness) nl() - Determines the thickness of staff and bar lines. - - dit(code(castingalgorithm))indexcode(castingalgorithm) nl() - The algorithm to use for breaking lines. Choices are - code(\Gourlay)keyindex(Gourlay) for a TeX()-like dynamic - programming algorithm, and code(\Wordwrap)keyindex(Wordwrap) for - a simple algorithm. Gourlay breaking looks much better, but - takes a lot more resources. Wordwrap leaves loosely spaced lines - at the end. -) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Context definitions) -label(contextdefs) -cindex(context definition) - -A notation contexts is defined by the following information - -enumerate( - it() A name. - - it() The LilyPond modules that do the actual conversion of music to - notation. Each module is a so-called - em(engraver)cindex(engraver). - - it() How these modules should cooperate, i.e. which ``cooperation - module'' should be used. This cooperation module is a special - type of engraver. - - it() What other contexts the context can contain, - - it() What properties are defined. -) - -A context definition has this syntax: - -quote( - code(\translator) code({) - var(translatorinit) var(translatormodifierlist) - code(}) -) - -var(translatorinit) can be an identifier or of the form - -quote( - code(\type) var(typename) code(;) -) - -var(typename) is one of - -description( - dit(code(Engraver_group_engraver))indexcode(Engraver_group_engraver) nl() - The standard cooperation engraver. - - dit(code(Score_engraver))indexcode(Score_engraver) nl() - This is cooperation module that should be in the top level context. - - dit(code(Grace_engraver_group))indexcode(Grace_engraver_group) nl() - This is a special cooperation module (resembling - code(Score_engraver)) that is used to created an embedded - `miniscore'. -) - -var(translatormodifierlist) is a list of items where each item is -one of - -itemize( - it() code(\consists) var(engravername) code(;) nl() - Add var(engravername) to the list of modules in this context. - bind(Section)ref(engravers) contains an overview of the engravers - available. The order of engravers added with code(\consists) is - significant. - - it() code(\consistsend) var(engravername) code(;) nl() - Analogous to code(\consists), but makes sure that - var(engravername) 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. - - it() code(\accepts) var(contextname) code(;) nl() - Add var(contextname) to the list of context this context can - contain. The first listed context the context to create by - default. - - it() code(\remove) var(engravername) code(;) nl() - Remove a previously added (with code(\consists)) engraver. - - it() code(\name) var(contextname) code(;) nl() - This sets name of the context, e.g. code(Staff), code(Voice). If - the name is not specified, the translator won't do anything. - - it() var(propname) code(=) var(value) code(;) nl() - A property assignment. It is allowed to use reals for - var(value). -) - -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 - -quote( -verb(\paper { - foo = \translator { ... } -} -\score { - \notes { - ... - } - \paper { - \translator { \foo ... } - } -}) -) - -subsubsect(Paper Types, Engravers, and Pre-defined Translators) -cindex(paper types, engravers, and pre-defined translators) - -Some pre-defined identifiers can simplify modification of -translators. The pre-defined identifiers are: - -description( - dit(code(StaffContext))indexcode(StaffContext) nl() - Default Staff context. - - dit(code(RhythmicStaffContext))indexcode(RhythmicStaffContext) nl() - Default RhythmicStaff context. - - dit(code(VoiceContext))indexcode(VoiceContext) nl() - Default Voice context. - - dit(code(ScoreContext))indexcode(ScoreContext) nl() - Default Score context. - - dit(code(ScoreWithNumbers))indexcode(ScoreWithNumbers) nl() - Score context with numbering at the Score level. - - dit(code(BarNumberingStaffContext))indexcode(BarNumberingStaffContext) nl() - Staff context with numbering at the Staff level. - - dit(code(HaraKiriStaffContext))indexcode(HaraKiriStaffContext) nl() - 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.) - - dit(code(OrchestralPartStaffContext))indexcode(OrchestralPartStaffContext) - - dit(code(OrchestralScoreContext))indexcode(OrchestralScoreContext) -) - -Using these pre-defined values, you can remove or add items to the -translator: - -quote( -verb(\paper { - \translator { - \StaffContext - \remove Some_engraver; - \consists Different_engraver; - } -}) -) - -subsubsect(Engravers) -label(engravers) - -The engravers for paper output are: - -[incomplete, FIXME] - -description( - dit(code(Bar_engraver))indexcode(Bar_engraver) nl() - Engraves bar lines. Normally in code(Staff) and - code(RhythmicStaff). - - dit(code(Bar_number_engraver))indexcode(Bar_number_engraver) nl() - 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. - - dit(code(Beam_engraver))indexcode(Beam_engraver) nl() - 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. - - dit(code(Beam_req_swallow_translator)) - indexcode(Beam_req_swallow_translator) nl() - Swallows beam requests. In code(LyricVoice). - - dit(code(Chord_name_engraver))indexcode(Chord_name_engraver) nl() - Engraves chord names. Normally in code(ChordNameVoice) . - - dit(code(Chord_tremolo_engraver))indexcode(Chord_tremolo_engraver) - - dit(code(Clef_engraver))indexcode(Clef_engraver) nl() - Engraves the clef symbol. Normally in code(Staff). - - dit(code(Collision_engraver))indexcode(Collision_engraver) - - dit(code(Dot_column_engraver))indexcode(Dot_column_engraver) nl() - 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. - - dit(code(Dynamic_engraver))indexcode(Dynamic_engraver) nl() - Engraves dynamics symbols. Normally in code(Voice). - - dit(code(Font_size_engraver))indexcode(Font_size_engraver) - - dit(code(Key_engraver))indexcode(Key_engraver) nl() - Engraves the key signature. Normally in code(Staff). - - dit(code(Local_key_engraver))indexcode(Local_key_engraver) - - dit(code(Lyric_engraver))indexcode(Lyric_engraver) nl() - Engraves lyrics. Normally in code(LyricVoice). - - dit(code(Multi_measure_rest_engraver)) - indexcode(Multi_measure_rest_engraver) nl() - Engraves multi-measure rests that are produced with code(R). - Normally in code(Voice). - - dit(code(Piano_bar_engraver))indexcode(Piano_bar_engraver) - - dit(code(Pitch_squash_engraver))indexcode(Pitch_squash_engraver) nl() - Treat all pitches as middle C. Used in code(RhythmicStaff). - Note that the notes move, but the locations of accidentals stay - the same. - - dit(code(Priority_horizontal_align_engraver)) - indexcode(Priority_horizontal_align_engraver) - - dit(code(Repeat_engraver))indexcode(Repeat_engraver) nl() - Handles repeats? In code(Staff) and code(RhythmicStaff). - - dit(code(Rest_collision_engraver))indexcode(Rest_collision_engraver) nl() - Handles collisions of rests. In code(Staff). - - dit(code(Rest_engraver))indexcode(Rest_engraver) nl() - Engraves rests. Normally in code(Voice). - - dit(code(Rhythmic_column_engraver))indexcode(Rhythmic_column_engraver) - - dit(code(Score_priority_engraver))indexcode(Score_priority_engraver) - - dit(code(Script_engraver))indexcode(Script_engraver) nl() - Handles note ornaments generated by code(\script). Normally in - code(Voice). - - dit(code(Separating_line_group_engraver)) - indexcode(Separating_line_group_engraver) - - dit(code(Skip_req_swallow_translator)) - indexcode(Skip_req_swallow_translator) - - dit(code(Slur_engraver))indexcode(Slur_engraver) nl() - Engraves slurs. Normally in code(Voice). - - dit(code(Span_bar_engraver))indexcode(Span_bar_engraver) nl() - Engraves lines across multiple staffs. Normally in - code(Staffgroup) and code(GrandStaff). Removing this from - code(StaffGroup) gives the definition of code(ChoirStaff). - - dit(code(Span_score_bar_engraver))indexcode(Span_score_bar_engraver) - - dit(code(Staff_group_bar_engraver))indexcode(Staff_group_bar_engraver) - - dit(code(Staff_margin_engraver))indexcode(Staff_margin_engraver) nl() - Prints the name of the instrument (specified by - code(Staff.instrument) and code(Staff.instr)) at the left of the - staff. - - dit(code(Staff_sym_engraver))indexcode(Staff_sym_engraver) - - dit(code(Stem_engraver))indexcode(Stem_engraver) nl() - Engraves stems. Normally in code(Voice). - - dit(code(Ties_engraver))indexcode(Ties_engraver) nl() - Engraves ties. Normally in code(Voice). - - dit(code(Time_signature_engraver))indexcode(Time_signature_engraver) nl() - Engraves the time signature. Normally in code(Staff) and - code(RhythmicStaff). - - dit(code(Timing_engraver))indexcode(Timing_engraver) nl() - 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). - - dit(code(Tuplet_engraver))indexcode(Tuplet_engraver) nl() - Engraves tuplet brackets? In code(Staff). - - dit(code(Vertical_align_engraver))indexcode(Vertical_align_engraver) -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Sound output) - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(output definition) - -The MIDI block is analogous to the paper block, but it is simpler. -The code(\midi) block can contain:cindex(MIDI block) - -itemize( - it() a code(\tempo) definition - it() context definitions -) - -Assignments in the code(\midi) block are not allowed. - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(Context definitions) -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). - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -subsect(MIDI Instrument Names) -cindex(MIDI instrument names) -label(midilist) - -The MIDI instrument name is set by the -indexandcode(Staff.midiInstrument) property or, if that property is -not set, the indexandcode(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. - -COMMENT( acordina = accordion, tango accordian = concertina - distortion guitar = distorted guitar - orchestral strings = harp - pan flute = wood flute? ) - -quote( -verb("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)") -) - -subsubsect(MIDI Types and Performers) -cindex(MIDI types and performers) - -The types available for MIDI translators are: - -description( - dit(code(Performer_group_performer))indexcode(Performer_group_performer) - dit(code(Score_performer))indexcode(Score_performer) - dit(code(Staff_performer))indexcode(Staff_performer) -) - -The performers for MIDI translators are: - -description( - dit(code(Key_performer))indexcode(Key_performer) - dit(code(Time_signature_performer))indexcode(Time_signature_performer) - dit(code(Note_performer))indexcode(Note_performer) - dit(code(Lyric_performer))indexcode(Lyric_performer) - dit(code(Swallow_performer))indexcode(Swallow_performer) -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(Pre-defined Identifiers) -cindex(pre-defined identifiers) -label(ident) - -Various identifiers are defined in the initialization files to -provide shorthands for some settings. Most of them are in -file(ly/declarations.ly). - -description( - dit(code(\break))keyindex(break) nl() - Force a line break in music by using a large argument for the - keyword code(\penalty). - - dit(code(\center))keyindex(center) nl() - Used for setting direction properties. bind(Equals)0. - - dit(code(\down))keyindex(down) nl() - Used for setting direction setting properties. Is equal - bind(to)-1. - - dit(code(\free))keyindex(free) nl() - Used for setting direction setting properties. Is equal - bind(to)0. - - dit(code(\left))keyindex(left) nl() - Used for setting text alignment property. Is equal bind(to)-1. - - dit(code(\nobreak))keyindex(nobreak) nl() - Prevent a line break in music by using a large negative argument - for the keyword code(\penalty). - - dit(code(\none))keyindex(none) nl() - Used for setting code(Score.beamslopedamping) and - code(Score.beamquantisation) properties. Is equal bind(to)0. - - dit(code(\normal))keyindex(normal) nl() - Used for setting code(Score.beamslopedamping) and - code(Score.beamquantisation) properties. Is equal bind(to)1. - - dit(code(\normalkey))keyindex(normalkey) nl() - Select normal key signatures where each octave has the same key - signature. This sets the code(Staff.keyoctaviation) property. - - dit(code(\right))keyindex(right) nl() - Used for setting text alignment property. Is set bind(to)1. - - dit(code(\shiftoff))keyindex(shiftoff) nl() - Disable horizontal shifting of note heads that collide. Sets the - code(Voice.horizontalNoteShift) property. - - dit(code(\shifton))keyindex(shifton) nl() - Enable note heads that collide with other note heads to be - shifted horiztonally. Sets the code(Voice.horizontalNoteShift) - property. - - dit(code(\slurboth))keyindex(slurboth) nl() - Allow slurs to be above or below notes. This sets the - code(Voice.slurVerticalDirection) property. - - dit(code(\slurdown))keyindex(slurdown) nl() - Force slurs to be below notes. This sets the - code(Voice.slurVerticalDirection) property. - - dit(code(\slurup))keyindex(slurup) nl() - Force slurs to be above notes. This sets the - code(Voice.slurVerticalDirection) property. - - dit(code(\specialkey))keyindex(specialkey) nl() - Allow key signatures do differ in different octaves. This sets - the code(Staff.keyoctaviation) property. - - dit(code(\stemboth))keyindex(stemboth) nl() - Allow stems, beams, and slurs to point either upwards or - downwards, decided automatically by LilyPond. This sets the - code(Voice.verticalDirection) property. - - dit(code(\stemdown))keyindex(stemdown) nl() - Force stems, beams, and slurs to point down. This sets the - code(Voice.verticalDirection) property. - - dit(code(\stemup))keyindex(stemup) nl() - Force stems, beams and slurs to point up. This sets the - code(Voice.verticalDirection) property. - - dit(code(\traditional))keyindex(traditional) nl() - Used for setting the code(Score.beamquantisation) property. Is - equal bind(to)2. - - dit(code(\up))keyindex(up) nl() - Used for setting various direction properties. Is equal - bind(to)1. -) - - -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) -COMMENT(%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%) - -sect(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: - -quote( -verb(\score { - \notes\relative c { - \input "yourfile.fly" - } - \paper{} - \midi{} -}) -) -The result of `file(.sly)' is similar except that a single unjustified -line is produced. - -If you invoke LilyPond with a file `file(foo.)var(ext)' that doesn't -have the `file(.ly)' extension, then LilyPond will look for a file -called `file(init.)var(ext)' and process this file. The file -`file(init.)var(ext)' 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.) - -whenlatex(latexcommand(\printindex)) - -COMMENT(End of reference-manual.yo) diff --git a/Documentation/tex/regression-test.tely b/Documentation/tex/regression-test.tely new file mode 100644 index 0000000000..9f9d06bcbf --- /dev/null +++ b/Documentation/tex/regression-test.tely @@ -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 index 0000000000..23ad4c3dfc --- /dev/null +++ b/Documentation/tex/tutorial.tely @@ -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 { + + \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 + \grace \times 2/3 { } + < + { \times 2/3 { a8 g c } \! c2 } + \context Voice = oboeTwo { + \stemdown + \grace { + \property Grace.verticalDirection = \down + [f,16 g] } + f8 e e2 + } > + \stemboth + \grace <)b8. d8.-\trill> | + [ < )f8. a>] <)b,8 d> r [ ] r | + [ < )e8. g>] +} + +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 + r4 + < {\stemup r2 } + \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 + +@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 +@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 < )d4 f> +@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 +@{ @} +@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 <)b8. d8.-\trill> | +@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/tex/tutorial.yo b/Documentation/tex/tutorial.yo deleted file mode 100644 index 5d5c11bac0..0000000000 --- a/Documentation/tex/tutorial.yo +++ /dev/null @@ -1,999 +0,0 @@ -mailto(gnu-music-discuss@gnu.org) -COMMENT(-*-text-*-) - -redef(var)(1)(whenlatex(latexcommand({\normalfont\scshape )ARG1+latexcommand(}))\ - whenhtml(sc(ARG1))) - -COMMENT(urg) -DEFINEMACRO(Large)(1)(\ - whenlatex(latexcommand(\Large{)ARG1+latexcommand(}))\ - whentexinfo(texinfocommand(@strong{)ARG1+texinfocommand(}))\ - whenhtml(htmlcommand()ARG1+htmlcommand())\ - whentxt(ARG1)) - -COMMENT( This document contains Mudela fragments. You need at least -Yodl-1.30.18 to convert this to tex or html. - -TODO - - * pipethrough(date) sucks. - * paragraphs have too much space. - * fix the amount of spaces (urg:tabs) at the start of verb() blocks - or even better: do verb and description side-by side - (TeX: use minipage construct): - - \foo This does the - foo construct - - The explaining texts are right in between examples. - Constructs like 'This shows' and 'The next line' are esp. - confusing, here. -) - -COMMENT( - Mainly written by Han-Wen Nienhuys, - - with help of (among others) - - * Jan Nieuwenhuizen -) - -htmlbodyopt(bgcolor)(white) -htmlcommand() - -latexlayoutcmds( - \topmargin -0.25in - \textheight 53\baselineskip - \advance\textheight by \topskip - \marginparwidth 1 in % Width of marginal notes. - \oddsidemargin 0.25 in % Note that \oddsidemargin = \evensidemargin - \evensidemargin 0.25 in - \marginparwidth 0.75 in - \textwidth 5.875 in % Width of text line. - \input mudela-book -) - -whenlatex(notableofcontents()) -whentexinfo(notableofcontents()) - -article(Typesetting music with LilyPond) - (Han-Wen Nienhuys and Jan Nieuwenhuizen) - (nop()PIPETHROUGH(date "+%B %d, %Y")()()nop()) - - -latexcommand(\def\interexample{}) -latexcommand(\def\preexample{\par}) -latexcommand(\def\postexample{\par\medskip}) -latexcommand(\def\file#1{{code(#1)}}) - -whenhtml( -includefile(html-disclaimer.yo-urg) -) - - -sect(Introduction) -label(tutorial:introduction) -latexcommand(\parindent2pc) - -LilyPond prints music from a specification that you, the user, supply. -You have to give that specification using a em(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. - -sect(The first tune) -label(sec:firsttune) - -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 bind(J.)bind(S.)Bach's em(Klavierbuechlein). - -COMMENT(urg: the fermata sign is placed below the note by default) -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; - } -}) - -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.COMMENT( - -)verb( - % lines preceded by a percent are comments. -)COMMENT( - -)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(%})'COMMENT( - -)verb( - \input "paper16.ly" -)COMMENT( - -)By default, LilyPond will use definitions for a 20 -nop(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.COMMENT( - -)verb( - \score { -) COMMENT( - -) 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. -verb( - \notes -) COMMENT( - -)This makes LilyPond ready for accepting notes. -verb( - \relative c'' -)COMMENT( - -) 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.COMMENT( - -)verb( - \sequential { -)COMMENT( - -) What follows is sequential music, i.e., -notes that are to be played and printed after each other.COMMENT( - -)verb( - \time 3/4; -) COMMENT( - -) 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.COMMENT( - -)verb( - \key g; -)COMMENT( - -) 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. COMMENT( - -)verb( - \repeat "volta" 2 -) COMMENT( - -) 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. -COMMENT( - -)verb( - { -)COMMENT( - -)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. COMMENT( - -)verb( - d4 -)COMMENT( - -) 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). COMMENT( - -)verb( - a b -)COMMENT( - -)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)) COMMENT( - -)verb( - d4 g, g | -)COMMENT( - -) 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. -COMMENT( - -)verb( - c8 d e fis -)COMMENT( - -)LilyPond guesses were beams can be added to eighth and shorter notes. -In this case, a beam over 4 eighths is added. -COMMENT( - -)verb( - c4 d8( )c b a( )b4 c8 b a g | -) COMMENT( - -) 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.COMMENT( -)verb( - a4 [b8 a] [g fis] -)COMMENT( - -)Automatic beaming can be overridden by inserting beam marks -(brackets). Brackets are put around notes you want beamed.COMMENT( - -)verb( - g2. | -)COMMENT( - -)A duration with augmentation dot is notated -with the duration number followed by a period.COMMENT( -)verb( - } -) COMMENT( - -) This ends the sequential music to be repeated. LilyPond will typeset -a repeat bar. COMMENT( - -)verb( - cis'4 b8 cis a4 | -) COMMENT( - -)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. COMMENT( - -)verb( - a8-. b-. cis-. d-. e-. fis-. -)COMMENT( - -)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. COMMENT( - -)verb( - fis a, r8 cis8 -) COMMENT( - -) -Rests are denoted by the special notename `code(r)'. You can also enter -an invisible rest by using the special notename `code(s)'. -verb( - d2.-\fermata -) COMMENT( - -)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 em(identifier). COMMENT( - -)verb( - } -) COMMENT( - -) -Here the music ends. -COMMENT( - -)verb( - \paper { - linewidth = 14.0\cm; - } -)COMMENT( - -)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). -COMMENT( - -)verb( - } -)COMMENT( - -)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 em(music), and not -notation. Therefore Second, the format tries to be em(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 em(generated) from a high-level musical -description. In other words, LilyPond would be best -described by `music compiler' or `music to notation compiler'. - - -sect(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.). - -verb(\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; } -}) - - -The result would look nop(this)footnote(The titling and font size shown -may differ, since the titling in this document is not generated by -file(ly2dvi).). - -center(bf(Large(The river is flowing)) - -var(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; } -}) - -Again, we will dissect the file line by line.COMMENT( - -)verb( - \header { -)COMMENT( - -)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. -verb( - title = "The river is flowing"; - composer = "Traditional (?)";)COMMENT( - -)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.COMMENT( - -)verb( - \include "paper16.ly" -)COMMENT( - -)Smaller size for inclusion in a book.COMMENT( - -)verb( - melody = \notes \relative c' { -)COMMENT( - -)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. - -verb( - \partial 8; -) - -The piece starts with an anacrusis of one eighth. COMMENT( - -)verb( - c4 c8 d [es () d] c4 | f4 f8 g [es() d] c g | - c4 c8 d [es () d] c4 | d4 es8 d c4. - \bar "|."; -)COMMENT( - -)We use explicit beaming. Since this is a song, we will turn automatic -beams off, and use explicit beaming where needed.COMMENT( - -)verb( - } -)COMMENT( - -)This ends the definition of code(melody). Note that there are no -semicolons after assignments at top level.COMMENT( - -)verb( - text = \lyrics { -)COMMENT( - -)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 {). COMMENT( - -)verb( - The4 ri -- ver is flo- __ wing, flo -- wing and gro -- wing, the - ri- ver is flo- __ wing down to the sea. - } -)COMMENT( - -)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.) -COMMENT( - -)verb( - accompaniment =\chords { -)COMMENT( - -)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. -COMMENT( - -)verb( - r8 -)COMMENT( - -)There is no accompaniment during the anacrusis.COMMENT( - -)verb( - c2-3- f-3-.7 -)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.COMMENT( - -)verb( - d-min es4 c8-min r8 -)COMMENT( - -)Some modifiers have predefined names, eg. code(min) is the same as -code(3-), so code(d-min) is a minor code(d) chord.COMMENT( - -)verb( - c2-min f-min7 g-7^3.5 c-min } -)COMMENT( - -)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. COMMENT( - -)verb( - \score { - \simultaneous { -)COMMENT( - -)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).COMMENT( - -)verb( - %\accompaniment -)COMMENT( - -)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. COMMENT( - -)verb( - \context ChordNames \accompaniment -)COMMENT( - -)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 em(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.COMMENT( - -)verb( - \addlyrics -)COMMENT( - -)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.)COMMENT( - -)verb( - \context Staff = mel { -)COMMENT( - -)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.COMMENT( - -)verb( - \property Staff.noAutoBeaming = "1" -)COMMENT( - -)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.COMMENT( - -)verb( - \property Staff.automaticMelismata = "1" -)COMMENT( - -)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. COMMENT( - -)verb( - \melody - } -)COMMENT( - -)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. COMMENT( - -)verb( - \context Lyrics \text -)COMMENT( - -)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.COMMENT( - -)verb( - } -)COMMENT( - -)This ends code(\simultaneous).COMMENT( - -)verb( - \midi { } -)COMMENT( - -)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 { }).COMMENT( - -)verb( - \paper { linewidth = 10.0\cm; } -)COMMENT( - -)We also want notation output. The linewidth is short so the piece -will be set in two lines. COMMENT( - -)verb( - } -)COMMENT( - -)End the score block. - -sect(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. COMMENT(Sesam atlas vd -Muziek. Deel II, blz 414) - -mudela(verbatim)( -\include "paper16.ly"; - -viola = \notes \relative c' \context Voice = viola { - - \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 - \grace \times 2/3 { } - < - { \times 2/3 { a8 g c } \! c2 } - \context Voice = oboeTwo { - \stemdown - \grace { - \property Grace.verticalDirection = \down - [f,16 g] } - f8 e e2 - } > - \stemboth - \grace <)b8. d8.-\trill> | - [ < )f8. a>] <)b,8 d> r [ ] r | - [ < )e8. g>] -} - -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 - r4 - < {\stemup r2 } - \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; } -}) - -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.COMMENT( - -)verb(viola = \notes \relative c' \context Voice = viola {)COMMENT( - -)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 nop(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.).COMMENT( - -)verb()COMMENT( - -)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.COMMENT( - -)verb(\property Voice.verticalDirection = \down)COMMENT( - -)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.COMMENT( - -)verb( g'8. b,16)COMMENT( - -)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). - -verb(s1 s2. r4)COMMENT( - -)code(s) is a `spacer' rest. It does not print anything, but it does -have the duration of a rest. COMMENT( - -)verb(oboes = \notes \relative c'' \context Voice = oboe {)COMMENT( - -)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).COMMENT( - -)verb(\stemup s4 g8. b,16 c8 r )COMMENT( - -)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. -COMMENT( - -)verb(\grace < )d4 f> )COMMENT( - -)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 nop(note.)footnote(LilyPond will squirm -about unended Slurs. In this case, you can ignore the warning). -COMMENT( - -)verb(\times 2/3)COMMENT( - -)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. COMMENT( - -)verb({ })COMMENT( - -)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(\<).COMMENT( - -)verb(<)COMMENT( - -)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: COMMENT( - -)verb( { \times 2/3 { a8 g c } \! c2 })COMMENT( - -)The crescendo is ended at the half note by the escaped exclamation -mark `code(\!)'. COMMENT( - -)verb(\context Voice = oboeTwo { -\stemdown)COMMENT( - -)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. COMMENT( - -)verb(\grace { )COMMENT( - -)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.COMMENT( - -)verb(\property Grace.verticalDirection = \down -[f,16 g] })COMMENT( - -)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). -COMMENT( - -)verb( - f8 e e2 -} >)COMMENT( - -)This ends the two-part section. COMMENT( - -)verb(\stemboth -\grace <)b8. d8.-\trill> | )COMMENT( - -)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:COMMENT( - -)verb(hoomPah = \notes \transpose c' {)COMMENT( - -)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 -nop(octave)footnote(code(hoomPah = \relative ...) would be more -intuitive to use, but that would not let me plug code(\transpose) -:-CHAR(41).).COMMENT( - -)verb(c8 \translator Staff = top \stemdown )COMMENT( - -)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. COMMENT( - -)verb(c'8 \translator Staff = bottom \stemup })COMMENT( - -)Then a note is put on the upper staff, and we switch again. We have -to name the lower staff `code(bottom)'. COMMENT( - -)verb(hoomPahHoomPah = { [\hoomPah \hoomPah] })COMMENT( - -)Put two of these fragments in sequence, and beam them.COMMENT( - -)verb(bassvoices = \notes \relative c' { -c4 g8. b,16 -\hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah -\hoomPahHoomPah)COMMENT( - -)Entering the bass part is easy: the hoomPahHoomPah variable is -referenced four times.COMMENT( - -)verb(\context Voice = reallyLow {\stemdown g2 ~ | g4 c8 } >)COMMENT( - -)After skipping some lines, we see code(~). This mark makes ties.COMMENT( - -)verb(\context PianoStaff)COMMENT( - -)For piano music, a special context is needed to get cross staff -beaming right. It is called code(PianoStaff).COMMENT( - -)verb(\context Staff = bottom < \time 2/2; \clef bass;)COMMENT( - -)The bottom staff must have a different clef.COMMENT( - -)verb(indent = 0.0;)COMMENT( - -)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.] - -sect(The end) - -That's all folks. From here, you can either try fiddling with input -files, or you can read the reference manual. - diff --git a/Documentation/topdocs/AUTHORS.texi b/Documentation/topdocs/AUTHORS.texi new file mode 100644 index 0000000000..c0eaec3cb0 --- /dev/null +++ b/Documentation/topdocs/AUTHORS.texi @@ -0,0 +1,69 @@ +\input texinfo @c -*-texinfo-*- +@setfilename AUTHORS.info +@settitle AUTHORS - who did what on GNU LilyPond- + +@node Top, , AUTHORS - who did what on GNU LilyPond-, (dir) +@top +@menu +* AUTHORS - who did what on GNU LilyPond-::AUTHORS - who did what on GNU LilyPond- +@end menu + +@node AUTHORS - who did what on GNU LilyPond-, Top, , Top +@chapter AUTHORS - who did what on GNU LilyPond? + + +This file lists authors of GNU LilyPond, and what they wrote. This +list is alphabetically ordered. + +@itemize @bullet +@item @email{tomcato@@xoommail.com, Tom Cato Amundsen}, + cembalo-partita in mudela, accordion symbols, some mudela-book.py +@item @email{matsb@@s3.kth.se, Mats Bengtsson}, + @uref{http://www.s3.kth.se/~matsb/} + lots of testing, fixes, general comments and contributions. +@item @email{eric@@aut.ee.ethz.ch, Eric Bullinger}, + accidental transposition. +@item Laura Conrad (lconrad@@world.std.com) + fixes to abc2ly +@item @email{Jan.A.Fagertun@@energy.sintef.no, Jan Arne Fagertun}, + TeX titling and lytodvi.sh +@item @email{foka@@debian.org, Anthony Fok}, + debian package: debian/* +@item @email{bjoern.jacke@@gmx.de, Bjoern Jacke} + german glossary stuff. +@item @email{nj104@@cus.cam.ac.uk, Neil Jerram}. + parts of Documentation/Vocab* +@item Donald Ervin Knuth, @uref{http://www-cs-staff.stanford.edu/~knuth/} + mf/ital-*.mf (these were taken from the CM fonts) +@item @email{m.krause@@tu-harburg.de, Michael Krause}, + breathing signs +@item @email{wl@@gnu.org, Werner Lemberg}, + misc bugfixes, some Beam and Stem code. +@item @email{drl@@vuse.vanderbilt.edu, David R. Linn}, + Mailing list maintenance. +@item @email{, Adrian Mariano} + Reference manual, tutorial fixes, glossary. +@item @email{hanwen@@cs.uu.nl, Han-Wen Nienhuys}, + @uref{http://www.cs.uu.nl/~hanwen/} + Main author (initials: HWN). +@item @email{janneke@@gnu.org, Jan Nieuwenhuizen}, + @uref{http://www.xs4all.nl/~jantien/} + Main author (initials: JCN). +@item @email{oliva@@dcc.unicamp.br, Alexandre Oliva}, + @uref{http://sunsite.unicamp.br/~oliva/} + testing +@item @email{pinard@@iro.umontreal.ca, Franc,ois Pinard}, + parts of Documentation/Vocab*, started internationalization stuff +@item @email{glenprideaux@@iname.com, Glen Prideaux}, + minor bug fix to script used to generate doc++ documentation +@item @email{daboys@@austin.rr.com, Jeffrey B. Reed}, + Windows-NT support. +@item Shay Rojanski + Some mudela source. +@end itemize + +Your name could be here! If you want to fix something, do it, and send +us a patch! + + +@bye diff --git a/Documentation/topdocs/AUTHORS.yo b/Documentation/topdocs/AUTHORS.yo deleted file mode 100644 index 3d41246cb2..0000000000 --- a/Documentation/topdocs/AUTHORS.yo +++ /dev/null @@ -1,56 +0,0 @@ -article(AUTHORS - who did what on GNU LilyPond?)()() - -This file lists authors of GNU LilyPond, and what they wrote. This -list is alphabetically ordered. - -itemize( -it()nemail(Tom Cato Amundsen)(tomcato@xoommail.com), - cembalo-partita in mudela, accordion symbols, some mudela-book.py -it()nemail(Mats Bengtsson)(matsb@s3.kth.se), - lurl(http://www.s3.kth.se/~matsb/) - lots of testing, fixes, general comments and contributions. -it()nemail(Eric Bullinger)(eric@aut.ee.ethz.ch), - accidental transposition. -it()nemail(Jan Arne Fagertun)(Jan.A.Fagertun@energy.sintef.no), - TeX titling and lytodvi.sh -it()nemail(Anthony Fok)(foka@debian.org), - debian package: debian/* -it()nemail(Bjoern Jacke)(bjoern.jacke@gmx.de) - german glossary stuff. -it()nemail(Neil Jerram)(nj104@cus.cam.ac.uk). - parts of Documentation/Vocab* -it()Donald Ervin Knuth, lurl(http://www-cs-staff.stanford.edu/~knuth/) - mf/ital-*.mf (these were taken from the CM fonts) -it()nemail(Michael Krause)(m.krause@tu-harburg.de), - breathing signs -it()nemail(Werner Lemberg)(xlwy01@uxp1.hrz.uni-dortmund.de), - misc bugfixes, some Beam and Stem code. -it()nemail(David R. Linn)(drl@vuse.vanderbilt.edu), - Mailing list maintenance. -it()nemail(Adrian Mariano)() - Reference manual, tutorial fixes, glossary. -it()nemail(Han-Wen Nienhuys)(hanwen@cs.uu.nl), - lurl(http://www.cs.uu.nl/~hanwen/) - Main author (initials: HWN). -it()nemail(Jan Nieuwenhuizen)(janneke@gnu.org), - lurl(http://www.xs4all.nl/~jantien/) - Main author (initials: JCN). -it()nemail(Alexandre Oliva)(oliva@dcc.unicamp.br), - lurl(http://sunsite.unicamp.br/~oliva/) - testing -it()nemail(Franc,ois Pinard)(pinard@iro.umontreal.ca), - parts of Documentation/Vocab*, started internationalization stuff -it()nemail(Glen Prideaux)(glenprideaux@iname.com), - minor bug fix to script used to generate doc++ documentation -it()nemail(Jeffrey B. Reed)(daboys@austin.rr.com), - Windows-NT support. -it()Shay Rojanski - Some mudela source. -it()Laura Conrad (lconrad@world.std.com) - fixes to abc2ly -) - - -Your name could be here! If you want to fix something, do it, and send -us a patch! - diff --git a/Documentation/topdocs/GNUmakefile b/Documentation/topdocs/GNUmakefile index db918cafb4..d59c175603 100644 --- a/Documentation/topdocs/GNUmakefile +++ b/Documentation/topdocs/GNUmakefile @@ -2,8 +2,12 @@ depth = ../.. BLURBS=BLURB COPERTINA FLAPTEKST -STEPMAKE_TEMPLATES=documentation yolily-topdoc -LOCALSTEPMAKE_TEMPLATES=lilypond +STEPMAKE_TEMPLATES=documentation tex texinfo yolily-topdoc +LOCALSTEPMAKE_TEMPLATES=lilypond mudela +HTML_FILES=$(addprefix $(outdir)/, $(TEXI_FILES:.texi=.html) $(TELY_FILES:.tely=.html)) + include $(depth)/make/stepmake.make +local-WWW: $(HTML_FILES) + diff --git a/Documentation/topdocs/INSTALL.texi b/Documentation/topdocs/INSTALL.texi new file mode 100644 index 0000000000..c246ff1574 --- /dev/null +++ b/Documentation/topdocs/INSTALL.texi @@ -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/INSTALL.yo b/Documentation/topdocs/INSTALL.yo deleted file mode 100644 index 9724f77a3a..0000000000 --- a/Documentation/topdocs/INSTALL.yo +++ /dev/null @@ -1,334 +0,0 @@ -article(NSTALL - compiling and installing GNU LilyPond)(HWN & JCN)() - -sect(ABSTRACT) - -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. - -sect(OBTAINING) - -You can get the latest version of LilyPond at -lurl(ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/). Refer to the links -document for mirror sites. - -em(If you upgrade by patching do remember to rerun autoconf after -applying the patch). - -sect(PREREQUISITES) - -For compilation you need: - -itemize( -it()A GNU system: GNU LilyPond is known to run on these GNU systems: Linux - (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix and -Solaris. - -it()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 ref(w32). - -it() EGCS 1.1 or newer. - -it() Python 1.5, -Check out -lurl(ftp://ftp.python.org) or lurl(ftp://ftp.cwi.nl/pub/python). - -it() GUILE 1.3, check out lurl(http://www.gnu.org/software/guile/guile.html). - -it()GNU make. -Check out lurl(ftp://ftp.gnu.org). - -it()Flex (version 2.5.4 or newer). -Check out lurl(ftp://ftp.gnu.org). - -it()Bison (version 1.25 or newer). -Check out lurl(ftp://ftp.gnu.org). - -it()Yodl. All documentation will be in Yodl. (1.31.15) -lurl(ftp://ftp.lilypond.org/pub/yodl). You need the latest version of YODL, -because the tutorial will trigger a bug in earlier versions. - -it()The geometry package for LaTeX is needed to use ly2dvi. -Available at -lurl(ftp://ftp.ctan.org/tex-archive/macros/latex/contrib/supported/geometry) -or at mirror site lurl(ftp://ftp.dante.de) - -it()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. -) - - -sect(RUNNING) - -GNU LilyPond does use a lot of resources. For operation you need the -following software - -itemize( -it()TeX -it()A PostScript printer and/or viewer (such as Ghostscript) is strongly - recommended. Xdvi will show all embedded PostScript too if you have - Ghostscript installed. -it() GUILE 1.3, check out lurl(http://www.gnu.org/programs/guile.html) -) - - -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: -verb(export MFINPUTS="/usr/local/share/lilypond/mf:" -export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:" -) -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. - -sect(WEBSITE) - -The website is the most convenient form to use for reading the -documentation on-line documentation. It is made by entering verb( - make website -)This does require a fully functioning - -If you want to auto-generate Lily's website, you'll need some additional -conversion tools. - -itemize( -it()YODL 1.31.15 or later. - -it()xpmtoppm (from the Portable Bitmap Utilities) (For RedHat Linux - users: it is included within the package libgr-progs). - the original is at -lurl(ftp://ftp.x.org/contrib/utilities/netpbm-1mar1994.p1.tar.gz) - -it()pnmtopng, which is also in libgr-progs for RedHat. The original is -at -lurl(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. - -verb( tar xzf libgr-2.0.13.tar.gz - make - cd png - rm libpng.so* - make pnmtopng -) - -You can then install the new pnmtopng into file(/usr/local/bin/) - -it()Bib2html lurl(http://pertsserver.cs.uiuc.edu/~hull/bib2html.) - Which, in turn depends on man2html for proper installation. -man2html can be had from lurl(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. - -it()Doc++ (optional) to read the source code. - -) - -You also have to install file(buildscripts/out/ps-to-gifs) in a -directory that is in the path. - - -sect(CONFIGURING and COMPILING) - -to install GNU LilyPond, simply type: -verb( - gunzip -c lilypond-x.y.z | tar xf - - cd lilypond-x.y.z - ./configure # fill in your standard prefix with --prefix - make - make install -) - -This will install a number of files, something close to: -verb( - /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 -) - - -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: - -verb( - export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" - ./configure -) - -code(CPPFLAGS) are the preprocessor flags. - -The configure script is Cygnus configure, and it will accept -bf(--help). If you are not root, you will probably have to make it -with a different bf(--prefix) option. Our favourite location is - -verb( - ./configure --prefix=$HOME/usr -) - -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 - -verb( - --enable-debugging - --enable-checking -) - -Options to configure include: - -description( -dit(bf(--enable-printing)) - Enable debugging print routines (lilypond bf(-D) option) -dit(bf(--enable-optimise)) - Set maximum optimisation: compile with bf(-O2). This can be -unreliable on some compiler/platform combinations (eg, DEC Alpha and PPC) -dit(bf(--enable-profiling)) - Compile with support for profiling. -dit(bf(--enable-config)) - Output to a different configuration file. Needed for multi-platform - builds -) - -All options are documented in the file(configure) help -The option bf(--enable-optimise) is recommended for Real Life usage. - -If you do - -verb( - make all -) - -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). - -sect(CONFIGURING FOR MULTIPLE PLATFORMS) - -If you want to compile LilyPond with different configuration settings, -then, you can use the bf(--enable-config) option. Example: suppose I -want to build with and without profiling. Then I'd use the -following for the normal build, - -verb( - ./configure --prefix=~ --disable-optimise --enable-checking - make - make install - ) - -and for the profiling version, I specify a different configuration. - -verb( - ./configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking - make config=optprof - make config=optprof install -) - - -sect(INSTALLING) - -If you have done a successful code(make), then a simple - -verb( - make install -) - -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). - -nsect(CAVEATS) - -itemize( -it()The -O2 option triggers bugs on various platforms (PowerPC, Alpha). - If you experience problems, you should first try turning off - this. -it() On PPC you need at least EGCS-1.1.2f. -) - -sect(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 -verb( - rpm -tb lilypond-x.y.z.tar.gz - rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z -) - -Precompiled i386 RedHat RPMS are available from -lurl(ftp://freshmeat.net/pub/rpms/lilypond/) and -lurl(http://linux.umbc.edu/software/lilypond/rpms/). - - -For compilation on a RedHat system you need these packages, -in addition to the thoes needed for running: -itemize( -it() glibc-devel -it() libstdc++-devel -it() guile-devel -it() flex -it() bison -) - - -sect(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/). - - -sect(WINDOWS NT/95) -label(w32) - - -Separate instructions on building for W32 are avaible -url(in the file README-W32.yo)(../../DOEXPAND(outdir)/README-W32.html). - -sect(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. - -sect(AUTHORS) - -nemail(Han-Wen Nienhuys)(hanwen@cs.uu.nl) - -nemail(Jan Nieuwenhuizen)(janneke@gnu.org) - -In case of problems, please use the mailing list for help. - - -Have fun! diff --git a/Documentation/topdocs/PATCHES.texi b/Documentation/topdocs/PATCHES.texi new file mode 100644 index 0000000000..d71dff6870 --- /dev/null +++ b/Documentation/topdocs/PATCHES.texi @@ -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/PATCHES.yo b/Documentation/topdocs/PATCHES.yo deleted file mode 100644 index eee04b313b..0000000000 --- a/Documentation/topdocs/PATCHES.yo +++ /dev/null @@ -1,138 +0,0 @@ -nsect(NAME) - -PATCHES - track and distribute your code changes - -nsect(DESCRIPTION) - -This page documents how to distribute your changes to GNU lilypond - -nsect(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( -it()make your fix/add your code -it()Add changes to NEWS, and add yourself to Documentation/topdocs/AUTHORS.yo -it()generate a patch, -it()e-mail your patch to one of the mailing lists - gnu-music-discuss@gnu.org or bug-gnu-music@gnu.org -) - -nsect(GENERATING A PATCH) - -In file(VERSION), set MY_PATCH_LEVEL: - -verb( - VERSION: - ... - MY_PATCH_LEVEL=jcn1 -) - -In file(NEWS), enter a summary of changes: - -verb( - NEWS: - pl 0.1.73.jcn1 - - added PATCHES.yo -) - -Then, from the top of Lily's source tree, type - -verb( - make dist - make diff -) - -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: - -verb( - make release - - tar-ball: ../patches/lilypond-0.1.73.jcn1.gz - patch: ../patches/lilypond-0.1.73.jcn1.gz - updeet: ../test/updeet -) - -nsect(PREREQUISITES) - -For creating a patch you need - -itemize( -it()All items mentioned in file(INSTALL). You're not going to send a patch - that you haven't even built, right? -it()GNU diff -it()Python (version 1.5 or newer). - You can of course make a patch by hand, which would go something like: - -verb( - make distclean - cd .. - diff -urN lilypond-0.1.73 lilypond-0.1.73.jcn1 > lilypond-0.1.73.jcn1 -) - -but there are handy python scripts available. If you're doing development, -you'll need Python for other LilyPond scripts anyway. - -it()The Lily directory structure, which looks like: - -includefile(../../stepmake/Documentation/layout.yo) -) - -nsect(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: - -verb( - gzip -dc ../patches/lilypond-0.1.74.diff.gz | patch -p1 -E -) - -and don't forget to make automatically generated files: - -verb( - autoconf footnote(patches don't include automatically generated files, - i.e. file(configure) and files generated by file(configure).) - - configure -) - -nsect(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: - -verb( - cd lilypond-0.1.74 - gzip -dc ../patches/lilypond-0.1.73.jcn1.diff.gz | patch -p1 -E - autoconf - configure -) - -Then, make a patch as shown above. - -nsect(SEE ALSO) - -file(stepmake/INSTALL.txt) - -nsect(MAINTAINER) - -nemail(Han-Wen Nienhuys)(hanwen@cs.uu.nl) - -Just keep on sending those patches! - diff --git a/Documentation/topdocs/README.texi b/Documentation/topdocs/README.texi new file mode 100644 index 0000000000..d7eb7764b8 --- /dev/null +++ b/Documentation/topdocs/README.texi @@ -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/README.yo b/Documentation/topdocs/README.yo deleted file mode 100644 index c5633cae31..0000000000 --- a/Documentation/topdocs/README.yo +++ /dev/null @@ -1,105 +0,0 @@ -COMMENT(-*-Text-*-) - - -redef(XXsetchapternum)(0)() - -notableofcontents() -article(This is the toplevel README to LilyPond)()() - -includefile(../BLURB.in) - -sect(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. - -sect(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. - - -sect(INSTALLATION) - -For your convenience, a formatted copy of the INSTALL instructions are -in the toplevel directory, as INSTALL.txt - -The process is fairly straightforward, but chances are that you have -to specify directories for TeX() to code(configure): this is done with -the options code(--enable-tex-dir) and code(--enable-mf-dir) - - -sect(DOCUMENTATION) - -The real documentation is the directory Documentation/ - -If you want to read the documentation online, these are options: -itemize( -it() use file(.html). Refer to INSTALL.txt for info on how to make the -.html documentation. -it() use file(.html). Point your browser to -lurl(http://www.cs.uu.nl/~hanwen/lilypond/index.html). -it() use file(.dvi), for the tutorial and reference manual. Do verb( - make -C Documentation/tex/ dvi) - -it() use ASCII. Do -using verb( - make -C Documentation/ -) -The tutorial and the reference manual can not be made in ASCII, as -they contain graphics. -) - - - -sect(COMMENTS) - -LilyPond is a long way from finished and polished. We do appreciate -criticism, comments, bugreports, patches, etc. -verb( - Please send your e-mail to one of the MAILING LISTS -) -and em(not) to us personally. See file(Documentation/links.yo) for more info. - - -sect(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 -lurl(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. - - -sect(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 -verb(rm `find /var/lib/texmf/fonts -name 'feta*'`) - -a script to do this for you is in file(buildscripts/clean-fonts.sh) - - -sect(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. - - -sect(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. - diff --git a/Documentation/topdocs/index.tely b/Documentation/topdocs/index.tely new file mode 100644 index 0000000000..253c68c3d0 --- /dev/null +++ b/Documentation/topdocs/index.tely @@ -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/Documentation/topdocs/index.yo b/Documentation/topdocs/index.yo deleted file mode 100644 index bf794f498e..0000000000 --- a/Documentation/topdocs/index.yo +++ /dev/null @@ -1,107 +0,0 @@ -DEFINEMACRO(depth)(0)(.) -DEFINEMACRO(docdir)(0)(Documentation) -DEFINEMACRO(pic)(1)(url(ARG1)(DOEXPAND(docdir)/pictures/DOEXPAND(outdir)/ARG1.png -)) - -DEFINEMACRO(beginbold)(0)(whenhtml(htmlcommand())) -DEFINEMACRO(endbold)(0)(whenhtml(htmlcommand())) -redef(htmlnewfile)(0)() -setchapterstring() - -nchapter(LilyPond -- The url(GNU Project)(http://www.fsf.org/gnu/gnu-history.html) Music Typesetter) - -includefile(../BLURB.in)(url(italiano)(DOEXPAND(docdir)/DOEXPAND(outdir)/COPERTINA.html))(url(nederlands)(DOEXPAND(docdir)/DOEXPAND(outdir)/FLAPTEKST.html)) -nl() -pic(screenshot) - -center(mudela(fragment)( - \relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 } -)) - -nsect(Free Software) - -Of course LilyPond, being part of the GNU project, is url(free -software)(http://www.fsf.org/copyleft/copyleft.html). For more -url(information)(http://www.fsf.org/philosophy/philosophy.html), see -the url(Free Software Foundation)(http://www.fsf.org/). - -LilyPond comes in two variants, a stable one, and a development -snapshots. The webpages matching the stable versions are at -lurl(http://www.gnu.org/software/...), the development pages are at -lurl(http://www.cs.uu.nl/~hanwen/lilypond/). - - -nsect(Preview) - -itemize( -beginbold() -it()url(Examples)(DOEXPAND(depth)/input/DOEXPAND(outdir)/index.html): -endbold() - simple pieces, tests and bugs. MIDI, PNG (gif replacement), PostScript, and Source. -beginbold() -it()url(Music in Mutopia)(DOEXPAND(depth)/mutopia/DOEXPAND(outdir)/index.html): -endbold() - LilyPond handling real music. MIDI, view PNG (gif replacement), PostScript, and Source. -) - -nsect(Documentation) - -itemize( -it()url(Tutorial)(DOEXPAND(docdir)/tex/DOEXPAND(outdir)/tutorial.html) -it()url(FAQ)(DOEXPAND(docdir)/DOEXPAND(outdir)/faq.html) -it()url(Mailing Lists)(DOEXPAND(docdir)/DOEXPAND(outdir)/mail.html) -it()url(All of the LilyPond documentation)(DOEXPAND(docdir)/DOEXPAND(outdir)/index.html) -it()url(The DOC++ documentation of the C++ sources.)(DOEXPAND(depth)/docxx/index.html) -it()url(The installation instructions)(Documentation/topdocs/DOEXPAND(outdir)/INSTALL.html) -) - -nsect(Sites) - -itemize( -it()lurl(http://www.cs.uu.nl/people/hanwen/lilypond/) Han-Wen's site -it()lurl(http://sca.uwaterloo.ca/lilypond/) Eric's mirror -it()lurl(http://home.austin.rr.com/jbr/jeff/lilypond/) Jeff's Windows NT Distribution site -) - -nsect(NEWS) - -This is what the latest version brings: -verb( -top_of_NEWS -) - -nsect(Download) - -beginbold() -Go get it at -itemize( -it()lurl(ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/) -endbold() -it() lurl(http://sca.uwaterloo.ca/lilypond/) - Eric Praetzel was kind enough to provide a mirror of both the website - and the ftp site. -it() lurl(ftp://ftp.lilypond.org/pub/LilyPond/) - A mirror of the FTP site. Updated at 0:00 MET daily. -it()lurl(ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/) RedHat binary -it()lurl(ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex) Debian binary -it()lurl(http://home.austin.rr.com/jbr/jeff/lilypond/) Windows NT binary -it()lurl(http://linux.umbc.edu/software/lilypond/rpms/) i386 RPM. -it()lurl(ftp://freshmeat.net/pub/rpms/lilypond/) i386 RPM. -) - -nsubsect(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 bf(development snapshots) -of LilyPond, specifically, this page was made from LilyPond -@TOPLEVEL_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. - -@COUNTER_REF@ diff --git a/Documentation/topdocs/scherm.in b/Documentation/topdocs/scherm.in deleted file mode 100644 index 005b6451c3..0000000000 --- a/Documentation/topdocs/scherm.in +++ /dev/null @@ -1,16 +0,0 @@ -18:46:03 mub ~/lelie$ lilypond twinkle -GNU LilyPond 0.1.78/FlowerLib 1.1.44. -Ontleden...[/home/fred/usr/src/lilypond/init/init.ly[/home/fred/usr/src/lilypond/init/declarations.ly[/home/fred/usr/src/lilypond/init/dynamic.ly][/home/fred/usr/src/lilypond/init/nederlands.ly][/home/fred/usr/src/lilypond/init/script.ly][/home/fred/usr/src/lilypond/init/paper20.ly[/home/fred/usr/src/lilypond/init/table20.ly][/home/fred/usr/src/lilypond/init/table13.ly][/home/fred/usr/src/lilypond/init/table16.ly][/home/fred/usr/src/lilypond/init/params.ly[/home/fred/usr/src/lilypond/init/a4.ly][/home/fred/usr/src/lilypond/init/paper.ly][/home/fred/usr/src/lilypond/init/engraver.ly]]][/home/fred/usr/src/lilypond/init/midi.ly[/home/fred/usr/src/lilypond/init/performer.ly]][/home/fred/usr/src/lilypond/init/property.ly]][/home/fred/usr/src/lilypond/input/twinkle.ly]] -Vertolken van muziek...[8][16][24][25] -duur: 1.34 seconden -Voorbewerken van elementen... [/home/fred/usr/src/lilypond/mf/out/feta20.afm] -Berekenen van kolomposities... [3][6][9][12][15][18][21][24][25] -geschat: 231 regels (van gemiddeld 21.4 kolommen) -exact berekend: 66 regels (van gemiddeld 25.5 kolommen) -duur: 6.11 seconden -Nabewerken van elementen... -TeX uitvoer naar twinkle.tex... - -Vertolken van muziek... -duur: 0.22 seconden -MIDI uitvoer naar twinkle.midi... diff --git a/Documentation/topdocs/schermo.in b/Documentation/topdocs/schermo.in deleted file mode 100644 index b4fb407537..0000000000 --- a/Documentation/topdocs/schermo.in +++ /dev/null @@ -1,16 +0,0 @@ -18:37:15 mub ~/lelie$ lilypond twinkle -GNU LilyPond 0.1.78/FlowerLib 1.1.44. -Analizzare...[/home/fred/usr/src/lilypond/init/init.ly[/home/fred/usr/src/lilypond/init/declarations.ly[/home/fred/usr/src/lilypond/init/dynamic.ly][/home/fred/usr/src/lilypond/init/nederlands.ly][/home/fred/usr/src/lilypond/init/script.ly][/home/fred/usr/src/lilypond/init/paper20.ly[/home/fred/usr/src/lilypond/init/table20.ly][/home/fred/usr/src/lilypond/init/table13.ly][/home/fred/usr/src/lilypond/init/table16.ly][/home/fred/usr/src/lilypond/init/params.ly[/home/fred/usr/src/lilypond/init/a4.ly][/home/fred/usr/src/lilypond/init/paper.ly][/home/fred/usr/src/lilypond/init/engraver.ly]]][/home/fred/usr/src/lilypond/init/midi.ly[/home/fred/usr/src/lilypond/init/performer.ly]][/home/fred/usr/src/lilypond/init/property.ly]][/home/fred/usr/src/lilypond/input/twinkle.ly]] -Interpretare musica...[8][16][24][25] -durata: 1.36 secondi -Preprocessare elementi... [/home/fred/usr/src/lilypond/mf/out/feta20.afm] -Calcolare posizioni di colonne... [3][6][9][12][15][18][21][24][25] -approssimato: 231 linee (con una media di 21 colonne): -calcolato esattamente: 66 linee (con una media di 25 colonne) -durata: 6.14 secondi -Postprocessare elementi... -Prodotto di TeX verso twinkle.tex... - -Interpretare musica... -durata: 0.21 secondi -Prodotto di MIDI verso twinkle.midi... diff --git a/Documentation/topdocs/topweb.yo b/Documentation/topdocs/topweb.yo deleted file mode 100644 index 64bd836383..0000000000 --- a/Documentation/topdocs/topweb.yo +++ /dev/null @@ -1 +0,0 @@ -whenhtml(htmlcommand()) diff --git a/INSTALL.txt b/INSTALL.txt index 7968bdb523..b64465f9c3 100644 --- a/INSTALL.txt +++ b/INSTALL.txt @@ -1,156 +1,135 @@ - NSTALL - compiling and installing GNU LilyPond - HWN & JCN +INSTALL - compiling and installing GNU LilyPond +*********************************************** -Contents +ABSTRACT +======== - 1: ABSTRACT -2: OBTAINING -3: PREREQUISITES -4: RUNNING -5: WEBSITE -6: CONFIGURING and COMPILING -7: CONFIGURING FOR MULTIPLE PLATFORMS -8: INSTALLING -9: REDHAT LINUX -10: DEBIAN GNU/LINUX -11: WINDOWS NT/95 -12: BUGS -13: AUTHORS + 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 +`buildscripts/set-lily.sh' script. It sets some environment variables +and symlinks, which comes in handly when you have to compile LilyPond +more often. -1: ABSTRACT +OBTAINING +========= -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 buildscripts/set-lily.sh script. -It sets some environment variables and symlinks, which comes -in handly when you have to compile LilyPond more often. + You can get the latest version of LilyPond at < +ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/>. Refer to the links document for +mirror sites. -2: OBTAINING + _If you upgrade by patching do remember to rerun autoconf after +applying the patch_. -You can get the latest version of LilyPond at -ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/. Refer to the links -document for mirror sites. +PREREQUISITES +============= -If you upgrade by patching do remember to rerun autoconf -after applying the patch. + For compilation you need: -3: PREREQUISITES + * A GNU system: GNU LilyPond is known to run on these GNU systems: + Linux (PPC, intel), FreeBSD, AIX, NeXTStep, IRIX, Digital Unix + and Solaris. -For compilation you need: + * 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 `--disable-debugging'. -o A GNU system: GNU LilyPond is known to run on these GNU - systems: Linux (PPC, intel), FreeBSD, AIX, NeXTStep, - IRIX, Digital Unix and Solaris. + Although we recommend to use Unix, LilyPond is known to run on + Windows NT/95/98 as well. See Section *Note w32::. -o 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 --disable- - debugging. + * EGCS 1.1 or newer. Check out < ftp://ftp.gnu.org/pub/gcc/> - Although we recommend to use Unix, LilyPond is known to - run on Windows NT/95/98 as well. See Section 11. + * Python 1.5, Check out or + . -o EGCS 1.1 or newer. + * GUILE 1.3, check out + . -o Python 1.5, Check out ftp://ftp.python.org or - ftp://ftp.cwi.nl/pub/python. + * GNU make. Check out . -o GUILE 1.3, check out http://www.gnu.org/soft- - ware/guile/guile.html. + * Flex (version 2.5.4 or newer). Check out + . -o GNU make. Check out ftp://ftp.gnu.org. + * Bison (version 1.25 or newer). Check out + . -o Flex (version 2.5.4 or newer). Check out - ftp://ftp.gnu.org. + * Texinfo. Check out . Most + documentation is in texinfo. -o Bison (version 1.25 or newer). Check out - ftp://ftp.gnu.org. + * Yodl. Needed for obsolete docs (1.31.17) + . -o Yodl. All documentation will be in Yodl. (1.31.15) - ftp://ftp.lilypond.org/pub/yodl. You need the latest - version of YODL, because the tutorial will trigger a - bug in earlier versions. + * The geometry package for LaTeX is needed to use ly2dvi. Available + at + + or at mirror site -o The geometry package for LaTeX is needed to use ly2dvi. - Available at ftp://ftp.ctan.org/tex- - archive/macros/latex/contrib/supported/geometry or at - mirror site ftp://ftp.dante.de + * MetaPost, if you want to use direct PostScript output. Please note + that tetex-0.4pl8 (included with Redhat 5.x) does not include + `mfplain.mp', which is needed for producing the scaleable font + files. -o MetaPost, if you want to use direct PostScript output. - Please note that tetex-0.4pl8 (included with Redhat - 5.x) does not include mfplain.mp, which is needed for - producing the scaleable font files. -4: RUNNING +RUNNING +======= -GNU LilyPond does use a lot of resources. For operation you -need the following software + GNU LilyPond does use a lot of resources. For operation you need the +following software -o TeX + * TeX -o A PostScript printer and/or viewer (such as - Ghostscript) is strongly recommended. Xdvi will show - all embedded PostScript too if you have Ghostscript - installed. + * A PostScript printer and/or viewer (such as Ghostscript) is + strongly recommended. Xdvi will show all embedded PostScript + too if you have Ghostscript installed. -o GUILE 1.3, check out http://www.gnu.org/pro- - grams/guile.html - -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: + * GUILE 1.3, check out + 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: export MFINPUTS="/usr/local/share/lilypond/mf:" export TEXINPUTS="/usr/local/share/lilypond/tex:/usr/local/share/lilypond/ps:" -The empty path component represents and MetaFont's default -search paths. Scripts with the proper paths for the bourne -and C-shell respectively are generated in build- -scripts/out/lilypond-profile and buildscripts/out/lilypond- -login during compilation. + 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 `buildscripts/out/lilypond-profile' and +`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. + LilyPond is a hiddeously big, slow and bloated program. A fast CPU +and plenty of RAM is recommended for comfortable use. -5: WEBSITE +WEBSITE +======= -The website is the most convenient form to use for reading -the documentation on-line documentation. It is made by -entering + The website is the most convenient form to use for reading the +documentation on-line documentation. It is made by entering make website + This does require a fully functioning -This does require a fully functioning - -If you want to auto-generate Lily's website, you'll need -some additional conversion tools. - -o YODL 1.31.15 or later. + If you want to auto-generate Lily's website, you'll need some +additional conversion tools. -o xpmtoppm (from the Portable Bitmap Utilities) (For Red- - Hat Linux users: it is included within the package - libgr-progs). the original is at ftp://ftp.x.org/con- - trib/utilities/netpbm-1mar1994.p1.tar.gz + * YODL 1.31.15 or later. -o pnmtopng, which is also in libgr-progs for RedHat. The - original is at - ftp://swrinde.nde.swri.edu/pub/png/applications/pnm- - topng-2.37.2.tar.gz.i + * xpmtoppm (from the Portable Bitmap Utilities) (For RedHat Linux + users: it is included within the package libgr-progs). + the original is at + - The version of 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 + * pnmtopng, which is also in libgr-progs for RedHat. The original is + at + .i - 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. + The version of `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. tar xzf libgr-2.0.13.tar.gz make @@ -158,188 +137,196 @@ o pnmtopng, which is also in libgr-progs for RedHat. The rm libpng.so* make pnmtopng - You can then install the new pnmtopng into - /usr/local/bin/ + You can then install the new pnmtopng into `/usr/local/bin/' -o Bib2html http://pertsserver.cs.uiuc.edu/~hull/bib2html. - Which, in turn depends on man2html for proper installa- - tion. man2html can be had from http://askdon- - ald.ask.uni-karlsruhe.de/hppd/hpux/Network- - ing/WWW/Man2html-1.05. + * Bib2html + Which, in turn depends on man2html for proper installation. + man2html can be had from + . - The website will build without this utility, but you - will not see our hypertextified bibliography. + The website will build without this utility, but you will not see + our hypertextified bibliography. -o Doc++ (optional) to read the source code. + * Doc++ (optional) to read the source code. -You also have to install buildscripts/out/ps-to-gifs in a + + You also have to install `buildscripts/out/ps-to-gifs' in a directory that is in the path. -6: CONFIGURING and COMPILING +CONFIGURING and COMPILING +========================= + + to install GNU LilyPond, simply type: + + gunzip -c lilypond-x.y.z | tar xf - + cd lilypond-x.y.z + ./configure # fill in your standard prefix with --prefix + make + make install -to install GNU LilyPond, simply type: + This will install a number of files, something close to: - gunzip -c lilypond-x.y.z | tar xf - - cd lilypond-x.y.z - ./configure # fill in your standard prefix with --prefix - make - make install + /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 -This will install a number of files, something close to: + 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: - /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 -The above assumes that you are root and have the GNU devel- -opment tools, and your make is GNU make. If this is not the -case, you can adjust your environment variables to your -taste: + export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" + ./configure - export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" - ./configure + `CPPFLAGS' are the preprocessor flags. -CPPFLAGS are the preprocessor flags. + The configure script is Cygnus configure, and it will accept +*-help*. If you are not root, you will probably have to make it with a +different *-prefix* option. Our favourite location is -The configure script is Cygnus configure, and it will accept ---help. If you are not root, you will probably have to make -it with a different --prefix option. Our favourite location -is - ./configure --prefix=$HOME/usr + ./configure --prefix=$HOME/usr -In this case, you will have to set up MFINPUTS, and TEXIN- -PUTS accordingly. + 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 + Since GNU LilyPond currently is beta, you are advised to also use - --enable-debugging - --enable-checking -Options to configure include: + --enable-debugging + --enable-checking ---enable-printing - Enable debugging print routines (lilypond -D option) + Options to configure include: ---enable-optimise - Set maximum optimisation: compile with -O2. This can - be unreliable on some compiler/platform combinations - (eg, DEC Alpha and PPC) +`*--enable-printing*' + Enable debugging print routines (lilypond *-D* option) ---enable-profiling +`*--enable-optimise*' + Set maximum optimisation: compile with *-O2*. This can be + unreliable on some compiler/platform combinations (eg, DEC Alpha + and PPC) + +`*--enable-profiling*' Compile with support for profiling. ---enable-config +`*--enable-config*' Output to a different configuration file. Needed for - multi-platform builds + multi-platform builds + + All options are documented in the `configure' help The option +*-enable-optimise* is recommended for Real Life usage. + + If you do -All options are documented in the configure help The option ---enable-optimise is recommended for Real Life usage. -If you do + make all - make all + everything will be compiled, but nothing will be installed. The +resulting binaries can be found in the subdirectories `out/' (which +contain all files generated during compilation). -everything will be compiled, but nothing will be installed. -The resulting binaries can be found in the subdirectories -out/ (which contain all files generated during compilation). +CONFIGURING FOR MULTIPLE PLATFORMS +================================== -7: CONFIGURING FOR MULTIPLE PLATFORMS + If you want to compile LilyPond with different configuration +settings, then, you can use the *-enable-config* option. Example: +suppose I want to build with and without profiling. Then I'd use the +following for the normal build, -If you want to compile LilyPond with different configuration -settings, then, you can use the --enable-config option. -Example: suppose I want to build with and without profil- -ing. Then I'd use the following for the normal build, ./configure --prefix=~ --disable-optimise --enable-checking make make install -and for the profiling version, I specify a different config- -uration. + and for the profiling version, I specify a different configuration. + ./configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking make config=optprof make config=optprof install -8: INSTALLING +INSTALLING +========== + + If you have done a successful `make', then a simple -If you have done a successful make, then a simple - make install + make install -should do the trick. + should do the trick. -If you are doing an upgrade, please remember to remove obso- -lete .pk and .tfm files of the fonts. A script has been -provided to do the work for you, see bin/clean-fonts.sh. + If you are doing an upgrade, please remember to remove obsolete +`.pk' and `.tfm' files of the fonts. A script has been provided to do +the work for you, see `bin/clean-fonts.sh'. CAVEATS +======= -o The -O2 option triggers bugs on various platforms - (PowerPC, Alpha). If you experience problems, you - should first try turning off this. + * The -O2 option triggers bugs on various platforms (PowerPC, + Alpha). If you experience problems, you should first try + turning off this. -o On PPC you need at least EGCS-1.1.2f. + * On PPC you need at least EGCS-1.1.2f. -9: REDHAT LINUX +REDHAT LINUX +============ -RedHat Linux users can compile an RPM. A spec file is in -make/out/lilypond.spec, it is distributed along with the -sources. + RedHat Linux users can compile an RPM. A spec file is in +`make/out/lilypond.spec', it is distributed along with the sources. -You can make the rpm by issuing + You can make the rpm by issuing - rpm -tb lilypond-x.y.z.tar.gz - rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z + rpm -tb lilypond-x.y.z.tar.gz + rpm -i /usr/src/redhat/RPMS/i386/lilypond-x.y.z -Precompiled i386 RedHat RPMS are available from ftp://fresh- -meat.net/pub/rpms/lilypond/ and http://linux.umbc.edu/soft- -ware/lilypond/rpms/. + Precompiled i386 RedHat RPMS are available from + and +. -For compilation on a RedHat system you need these packages, -in addition to the thoes needed for running: + For compilation on a RedHat system you need these packages, in +addition to the thoes needed for running: + * glibc-devel -o glibc-devel + * libstdc++-devel -o libstdc++-devel + * guile-devel -o guile-devel + * flex -o flex + * bison -o bison +DEBIAN GNU/LINUX +================ -10: DEBIAN GNU/LINUX + A Debian package is also available; contact Anthony Fok +. The build scripts are in the subdirectory `debian/'. -A Debian package is also available; contact Anthony Fok -foka@debian.org. The build scripts are in the subdirectory -debian/. +WINDOWS NT/95 +============= -11: WINDOWS NT/95 + Separate instructions on building for W32 are available +<../../outdir/README-W32.html>. -Separate instructions on building for W32 are avaible in the -file README-W32.yo. +BUGS +==== -12: 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. -Send bug reports to bug-gnu-music@gnu.org. For help and -questions use help-gnu-music@gnu.org and gnu-music-dis- -cuss@gnu.org. Please consult the faq before mailing your -problems. +AUTHORS +======= -13: AUTHORS + Han-Wen Nienhuys -Han-Wen Nienhuys + Jan Nieuwenhuizen -Jan Nieuwenhuizen + In case of problems, please use the mailing list for help. -In case of problems, please use the mailing list for help. + Have fun! -Have fun! diff --git a/NEWS b/NEWS index 46cf0a67b5..1d595bfa44 100644 --- 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/README.txt b/README.txt index d5dd11f037..34ebbcad13 100644 --- a/README.txt +++ b/README.txt @@ -1,103 +1,109 @@ - 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. Lily- -Pond is part of the GNU Project. + ) -1: VERSIONING +This is the toplevel README to LilyPond +*************************************** -LilyPond uses a versioning scheme similar to the Linux ker- -nel. 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. + 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. -2: REQUIREMENTS +versioning +========== -For the compilation and running of LilyPond you need some -additional packages. Please refer to the installation -instructions. + 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. -NOTE: If you downloaded a binary (.rpm or a W95/NT .zip -file), then you don't have to compile LilyPond. +requirements +============ -3: INSTALLATION + For the compilation and running of LilyPond you need some additional +packages. Please refer to the installation instructions. -For your convenience, a formatted copy of the INSTALL -instructions are in the toplevel directory, as INSTALL.txt + NOTE: If you downloaded a binary (.rpm or a W95/NT .zip file), then +you don't have to compile LilyPond. -The process is fairly straightforward, but chances are that -you have to specify directories for to configure: this is -done with the options --enable-tex-dir and --enable-mf-dir +installation +============ -4: DOCUMENTATION + For your convenience, a formatted copy of the INSTALL instructions +are in the toplevel directory, as INSTALL.txt -The real documentation is the directory Documentation/ + The process is fairly straightforward, but chances are that you have +to specify directories for TeX to `configure': this is done with the +options `--enable-tex-dir' and `--enable-mf-dir' -If you want to read the documentation online, these are -options: +documentation +============= -o use .html. Refer to INSTALL.txt for info on how to make - the .html documentation. + The real documentation is the directory Documentation/ -o use .html. Point your browser to - http://www.cs.uu.nl/~hanwen/lilypond/index.html. + If you want to read the documentation online, these are options: + * use `.html'. Refer to INSTALL.txt for info on how to make the + .html documentation. -o use .dvi, for the tutorial and reference manual. Do + * use `.html'. Point your browser to + `http://www.cs.uu.nl/~hanwen/lilypond/index.html'. - make -C Documentation/tex/ dvi + * use `.dvi', for the tutorial and reference manual. Do -o use ASCII. Do using + make -C Documentation/tex/ dvi - make -C Documentation/ + * use ASCII. Do using - The tutorial and the reference manual can not be made - in ASCII, as they contain graphics. + make -C Documentation/ -5: COMMENTS + The tutorial and the reference manual can not be made in ASCII, as + they contain graphics. -LilyPond is a long way from finished and polished. We do -appreciate criticism, comments, bugreports, patches, etc. +comments +======== - Please send your e-mail to one of the MAILING LISTS + LilyPond is a long way from finished and polished. We do appreciate +criticism, comments, bugreports, patches, etc. -and not to us personally. See Documentation/links.yo for -more info. + Please send your e-mail to one of the MAILING LISTS -6: WINDOWS 32 + and _not_ to us personally. See `Documentation/links.yo' for more +info. -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 ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/ +windows 32 +========== -If you decide to build LilyPond from source, please read the -INSTALL.txt document first, especially the Windows NT/95 -section. + 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 +`ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/' -7: CAVEATS + If you decide to build LilyPond from source, please read the +INSTALL.txt document first, especially the Windows NT/95 section. -* Please read the file BUGS for some ugly bugs. +caveats +======= -* If you have installed a previous version, be sure to -remove old font files, eg + * Please read the file BUGS for some ugly bugs. + * If you have installed a previous version, be sure to remove old +font files, eg rm `find /var/lib/texmf/fonts -name 'feta*'` -a script to do this for you is in buildscripts/clean- -fonts.sh + a script to do this for you is in `buildscripts/clean-fonts.sh' + +bugs +==== -8: 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. -Send bug reports to bug-gnu-music@gnu.org. For help and -questions use help-gnu-music@gnu.org and gnu-music-dis- -cuss@gnu.org. Please consult the faq before mailing your -problems. +cdrom distributions +=================== -9: 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. -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. diff --git a/TODO b/TODO index ae058662c9..cb02f6a3d4 100644 --- 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 diff --git a/VERSION b/VERSION index 9747bff5a3..e752f734ff 100644 --- a/VERSION +++ b/VERSION @@ -1,7 +1,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=2 -PATCH_LEVEL=4 +PATCH_LEVEL=5 MY_PATCH_LEVEL= # use the above to send patches: MY_PATCH_LEVEL is always empty for a diff --git a/aclocal.m4 b/aclocal.m4 index 7417b337a5..a7127718d8 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -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 ]) diff --git a/buildscripts/mutopia-index.py b/buildscripts/mutopia-index.py index 11a1221059..5ea6bad2f2 100644 --- a/buildscripts/mutopia-index.py +++ b/buildscripts/mutopia-index.py @@ -10,6 +10,10 @@ import stat sys.path.append ('@abs-step-bindir@') +def gulp_file (fn): + f = open (fn) + return f.read () + header_regex = regex.compile('\\header[ \t\n]*{\([^}]*\)}') header_entry_regex = regex.compile('[\n\t ]*\([^\n\t ]+\)[\n\t ]*=[\n \t]*\([^;]+\)[\n \t]*;') diff --git a/config.make.in b/config.make.in index be2cb00274..0c1b920b10 100644 --- a/config.make.in +++ b/config.make.in @@ -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@ diff --git a/configure b/configure index 3ebe0d3ded..25bdbb0df3 100755 --- 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 <&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 <&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 <&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 <&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 <&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/flower/directed-graph.cc b/flower/directed-graph.cc deleted file mode 100644 index 0c9a7cc085..0000000000 --- a/flower/directed-graph.cc +++ /dev/null @@ -1,154 +0,0 @@ -/* - edge_out.cc -- implement Directed_graph_node - - source file FlowerLib - - (c) 1997--1999 Han-Wen Nienhuys -*/ - -#include "directed-graph.hh" - -#ifdef PARANOID // these checks eat huge amounts of time. -#define PARANOID_OK() OK() -#else -#define PARANOID_OK() -#endif - - -Link_array const & -Directed_graph_node::get_in_edge_arr() const -{ - return edge_in_l_arr_; -} - -Link_array const & -Directed_graph_node::get_out_edge_arr() const -{ - return edge_out_l_arr_; -} - -/* - Should not copy deps automatically - */ -Directed_graph_node::Directed_graph_node (Directed_graph_node const&) -{ -} - -void -Directed_graph_node::copy_edges_out (Directed_graph_node const &s) -{ - for (int i=0; i < s.edge_out_l_arr_.size(); i++) - add_edge (s.edge_out_l_arr_[i]); -} - -void -Directed_graph_node::OK() const -{ -#ifndef NDEBUG - for (int i=0; i < edge_out_l_arr_.size(); i++) - { - assert (edge_out_l_arr_[i]-> - edge_in_l_arr_.find_l (this)); - } - for (int i=0; i < edge_in_l_arr_.size(); i++) - assert (edge_in_l_arr_[i]->contains_b (this)); -#endif -} - -bool -Directed_graph_node::contains_b (const Directed_graph_node *d) const -{ - return edge_out_l_arr_.find_l ((Directed_graph_node*)d); -} - -void -Directed_graph_node::remove_edge_out_idx (int i) -{ - PARANOID_OK(); - Directed_graph_node * d_l = edge_out_l_arr_.get (i); - - int j = d_l->edge_in_l_arr_.find_i (this); - assert (j>=0); - d_l->edge_in_l_arr_.unordered_del (j); - PARANOID_OK(); -} - -void -Directed_graph_node::remove_edge_in (Directed_graph_node *d_l) -{ - PARANOID_OK(); - d_l->remove_edge_out (this); - PARANOID_OK(); -} - -void -Directed_graph_node::remove_edge_out (Directed_graph_node *d_l) -{ - PARANOID_OK(); - for (int i=0; i < edge_out_l_arr_.size();) - { - if (edge_out_l_arr_[i]== d_l) - remove_edge_out_idx (i); - else - i++; - } - PARANOID_OK(); -} -bool -Directed_graph_node::linked_b() const -{ - return edge_out_l_arr_.size() || edge_in_l_arr_.size (); -} - -void -Directed_graph_node::junk_links() -{ - edge_in_l_arr_.set_size (0); - edge_out_l_arr_.set_size (0); -} - - -void -Directed_graph_node::unlink() -{ -#ifdef PARANOID - PARANOID_OK(); - - Link_array t = edge_out_l_arr_; - t.concat (edge_in_l_arr_); -#endif - - while (edge_out_l_arr_.size()) - remove_edge_out_idx (0); - - while (edge_in_l_arr_.size()) - remove_edge_in (edge_in_l_arr_[0]); - -#ifdef PARANOID - for (int i =0; i < t.size(); i++) - t[i]->OK(); -#endif -} - -Directed_graph_node::~Directed_graph_node() -{ - // assert (!linked_b()); // hampered by memfrobbing -} - - -void -Directed_graph_node::add_edge (Directed_graph_node* dep_l) -{ - PARANOID_OK(); - if (!dep_l) - return ; - dep_l->edge_in_l_arr_.push (this); - edge_out_l_arr_.push (dep_l); - PARANOID_OK(); -} - - -Directed_graph_node::Directed_graph_node() -{ -} - diff --git a/flower/include/directed-graph.hh b/flower/include/directed-graph.hh deleted file mode 100644 index 9f6c9b3dfe..0000000000 --- a/flower/include/directed-graph.hh +++ /dev/null @@ -1,51 +0,0 @@ -/* - edge_out.hh -- declare Directed_graph_node - - source file of the GNU LilyPond music typesetter - - (c) 1997--1999 Han-Wen Nienhuys -*/ - - -#ifndef DEPENDENCY_HH -#define DEPENDENCY_HH - -#include "parray.hh" - -/** - Class to handle two-sided connections between nodes (the Dependencies) - */ -class Directed_graph_node { - Link_arrayedge_out_l_arr_; - /// targets - Link_array edge_in_l_arr_; - -public: - - /** remove i-th edge_out (and exactly one ref to me in the edge_out) - */ - void remove_edge_out_idx (int i); - void copy_edges_out (Directed_graph_node const&); - bool linked_b() const; - void unlink(); - void junk_links(); - void add_edge (Directed_graph_node*); - void remove_edge_in (Directed_graph_node *); - void remove_edge_out (Directed_graph_node*); - bool contains_b (Directed_graph_node const*) const; - - Directed_graph_node (Directed_graph_node const &); - void OK() const; - Directed_graph_node(); - - ~Directed_graph_node(); - - /** - ensure that no edge_out exists doubly. - */ - void uniq(); - Link_array const& get_out_edge_arr() const; - Link_array const& get_in_edge_arr() const; -}; - -#endif // DEPENDENCY_HH diff --git a/input/bugs/addlyrmus.fly b/input/bugs/addlyrmus.fly new file mode 100644 index 0000000000..32b095b864 --- /dev/null +++ b/input/bugs/addlyrmus.fly @@ -0,0 +1,4 @@ + +\context Voice \addlyrics + { s8 s16 s32 s64 } + { [c16 c c c] } diff --git a/input/bugs/addlyrmus.ly b/input/bugs/addlyrmus.ly deleted file mode 100644 index 32b095b864..0000000000 --- a/input/bugs/addlyrmus.ly +++ /dev/null @@ -1,4 +0,0 @@ - -\context Voice \addlyrics - { s8 s16 s32 s64 } - { [c16 c c c] } diff --git a/input/bugs/core.ly b/input/bugs/core.ly deleted file mode 100644 index ef4cb12e69..0000000000 --- a/input/bugs/core.ly +++ /dev/null @@ -1,11 +0,0 @@ - -text = \lyrics \repeat "fold" 2 {} -\alternative { - foo bar - afoo abar -} - - -\score { -\text -} diff --git a/input/bugs/dots.fly b/input/bugs/dots.fly index 66f99d1de7..4372115e20 100644 --- a/input/bugs/dots.fly +++ b/input/bugs/dots.fly @@ -1,2 +1,2 @@ - +\context Voice { } diff --git a/input/bugs/hinterfleisch-gone.ly b/input/bugs/hinterfleisch-gone.ly index 2a51746a62..59fd4de8d1 100644 --- a/input/bugs/hinterfleisch-gone.ly +++ b/input/bugs/hinterfleisch-gone.ly @@ -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 index 0000000000..f042e73068 --- /dev/null +++ b/input/bugs/l.ly @@ -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/swits.ly b/input/bugs/swits.ly deleted file mode 100644 index 44ee313124..0000000000 --- a/input/bugs/swits.ly +++ /dev/null @@ -1,15 +0,0 @@ -\score{ - \context PianoStaff < - \context Staff=one \notes{ s2 } - \context Staff=two \notes\relative c{ - \time 4/8; - \clef "bass"; - [c8( e \stemup \translator Staff=one \stemup - g )c] - } - > - \paper { - linewidth=-1.0; - } -} -) diff --git a/input/bugs/utremi_old.ly b/input/bugs/utremi_old.ly new file mode 100644 index 0000000000..60a62403fa --- /dev/null +++ b/input/bugs/utremi_old.ly @@ -0,0 +1,262 @@ +\header { +filename = "utremi.ly"; +enteredby = "Christian Mondrup"; +%composer = "Thomas Ravenscroft"; +opus = "Thomas Ravenscroft"; +%opus = "Pammelia, 1609, no. 31"; +arranger = "Pammelia, 1609, no. 31"; +title = "Vt, re, me, fa, sol, la, sol, fa, re, vt"; +tagline = "Typeset with GNU LilyPond by Christian Mondrup. Non-commercial copying welcome."; +} + +papersize = "letter" + +\include "paper16.ly" +%\include "a4.ly" + +lyricsOne = \lyrics { + ""\breve ""8 + "Vt,"\breve re, me, fa, sol, la, "" + sol, la, fa, me, re, vt. +} + +lyricsTwo = \lyrics { + "" "" + Hey downe downe hey downe downe downe downe hey down + hey down "" down down a. + My heart of gold as true as steele + as I me leant "" vn -- to the bowres. + but if my La -- dy loue me well, + Lord so Ro -- bin bowres, +} + +lyricsThree = \lyrics { + "" "" "" "" "" "" "" "" "" "" "" "" + heaue and hoe Rum -- be -- lo, hey tro -- lo tro -- ly lo, + hey tro -- ly trol -- ly hey tro -- ly trol -- ly + hey tro -- ly trol -- ly hey trol -- "" ly trol -- ly lo. + My La -- dies gone to Can -- ter -- bu -- ry + S. Tho -- mas be her boote. + Shee met with Kate of Malms -- "" bu -- ry, + why weepst thou ma -- ple +} + +lyricsFour = \lyrics { + "" + roote: + O sleepst thou or wakst thon Ies -- se -- ry, Cooke, + the rost it burnes, turne round turne round "" a -- bout "" + turne round "" a -- bout, "" + turne round "" a -- bout, "" turne round. "" + O Fri -- er how fares thy ban -- de -- low ban -- de -- low + Fri -- er, how fares thy San -- de -- low, San -- de -- low. +} + +global = \notes { + \key c; + %\time 4/2; + %\time 17/8; + \time 33/16; + \clef "tenor"; +} + +dummyBeat = \notes { + \property Staff.defaultBarType = "||" + \property Staff.barAlways = "1" + s16 + \property Staff.barAlways = "0" + \property Staff.defaultBarType = "|" +} + +incipOne = \notes\relative c' { + g\breve + \dummyBeat + \bar ""; +} + +incipTwo = \notes\relative c'' { + \property Voice.noteHeadStyle = "diamond" + g1. + \property Voice.noteHeadStyle = "" + f2 + \dummyBeat + \bar ""; +} + +incipThree = \notes\relative c' { + \property Voice.noteHeadStyle = "harmonic" + \property Voice.tupletVisibility = 0 + \times 2/3 { d4. e8 d4 } \times 2/3 { b4. a8 g4 } + \times 2/3 { b4. c8 b4 } \times 2/3 { b4. a8 g4 } + \dummyBeat + \property Voice.tupletVisibility = 3 + \bar ""; +} + +incipFour = \notes\relative c' { + \property Voice.noteHeadStyle = "diamond" + %\property Voice.restStyle = "mensural" + b1 r1 + \dummyBeat + \bar ""; +} + +partOne = \notes\relative c' { + %\property Score.currentBarNumber = "1" + \property Voice.noteHeadStyle = "" + %\property Staff.barNumberScriptPadding = 1 + g1 ~ | g | a ~ | a | bes ~ | bes | c ~ | c | d ~ | d | e ~ | e | + r | r | + e ~ | e | d ~ | d | c ~ | c | bes ~ | bes | a ~ | a | g ~ | g + \bar "|."; +} + +partTwo = \notes\relative c'' { + \property Voice.noteHeadStyle = "" + g2. f4 | e2 d | c4. b8 a4 g | f2 e | + d g ~ | g4 a g2 | c,1 | r2 c | + g'2. a4 | b2 g | c c | c c | + b4 c d2 ~ | d4 d b g | c1 | r2 c | + g g | d2. e4 | f2 e | c1 | + g'2. g4 | g2 g | c,1 ~ | c | r | r + \bar "|."; +} + +partThree = \notes\relative c' { + \property Voice.noteHeadStyle = "" + \times 2/3 { d4. e8 d4 } \times 2/3 {b4. a8 g4 } | + \times 2/3 { b4. c8 b4 } \times 2/3 { b4. a8 g4 } + c2 c4 c | c2 c | + d2 d4 d | d2 d | e2. f4 | e2 d4 c | + b2 g ~ | g4 f e d | c1 | r2 c | + g'2. g4 | g2 g | c,2. c4 | c c c'2 | + bes g | bes bes | a1 | r2 e' | + d d | g g | a2. g4 | fis e d2 | + g g | d2. c4 + \bar "|."; +} + +partFour = \notes\relative c' { + \property Voice.noteHeadStyle = "" + b1^\fermata | r2 g' | e e4 e | a2. g4 | + fis2 e4 d | g1 | g2 g | g g | + g g | g g ~ | g4 f e d | c2 d ~ | + d4 c b a | g2 g' ~ | g4 f e d | c2 g' ~ | + g r | \times 2/3 { r1 d2 } \times 2/3 { a'2 a g } | + \times 2/3 { e1 f2 } \times 2/3 { g2. g4 g2 } + \times 2/3 { d2. d4 e2 } \times 2/3 { f2. f4 e2 } + \times 2/3 { d1 c2 } \times 2/3 { b2. a4 g2 } + \times 2/3 { d'2. d4 d2 } + \bar "|."; +} + +partOneStaff = < + \context Staff = vocal1 < + \property Staff.clefStyle = "fullSizeChanges" + \property Staff.instrument = "\large{1.}" + %\property Staff.instr = "" + \notes { + \global + \property Staff.timeSignatureStyle = "old4/4" + \incipOne + \clef "G_8"; + \property Staff.timeSignatureStyle = "C2/2" + \time 4/4; + \partOne + } + {\context Lyrics = lyrOne \lyricsOne } + > +> + +partTwoStaff = < + \context Staff = vocal2 < + \property Staff.clefStyle = "fullSizeChanges" + \property Staff.instrument = "\large{2.}" + %\property Staff.instr = "" + %\property Voice.automaticMelismata = "1" + \addlyrics + \notes { + \global + \property Staff.timeSignatureStyle = "old4/4" + \incipTwo + \clef "G_8"; + \property Staff.timeSignatureStyle = "C2/2" + \time 4/4; + \partTwo + } + {\context Lyrics = lyrTwo \lyricsTwo } + > +> + + +partThreeStaff = < + \context Staff = vocal3 < + \property Staff.clefStyle = "fullSizeChanges" + \property Staff.instrument = "\large{3.}" + %\property Staff.instr = "" + %\property Voice.automaticMelismata = "1" + \addlyrics + \notes { + \context Voice = vthree + \property Voice.tupletDirection = \up + \global + \property Staff.timeSignatureStyle = "old4/4" + \incipThree + \clef "G_8"; + \property Staff.timeSignatureStyle = "C2/2" + \time 4/4; + \partThree + } + {\context Lyrics = lyrThree \lyricsThree } + > +> + +partFourStaff = < + \context Staff = vocal4 < + \property Staff.clefStyle = "fullSizeChanges" + \property Staff.timeSignatureStyle = "C2/2" + \property Staff.barNumberDirection = \up + \property Staff.instrument = "\large{4.}" + \property Staff.instr = "" + %\property Voice.automaticMelismata = "1" + \addlyrics + \notes { + \context Voice = vfour + \property Voice.tupletDirection = \up + \global + %\property Staff.instrument = "\large{4.}" + %\property Staff.instr = "" + \property Staff.timeSignatureStyle = "old4/4" + \incipFour + \clef "G_8"; + \property Staff.timeSignatureStyle = "C2/2" + \time 4/4; + \partFour + } + {\context Lyrics = lyrFour \lyricsFour} + > +> + +\score { + \context StaffGroup < + \partFourStaff + \partThreeStaff + \partTwoStaff + \partOneStaff + > + %\paper {\translator {\BarNumberingStaffContext } } + \paper { + indent = 0.\mm; + linewidth = 17.0\cm; + textheight = 27.0\cm; + gourlay_maxmeasures=6.0; + \translator { \StaffContext + \consists "Staff_margin_engraver"; } + %\translator { \ScoreContext + % minVerticalAlign = 1.5*\staffheight; } + } + %\midi { + % output = "utremi.mid"; + % \tempo 2 = 80; + %} +} diff --git a/input/test/repeat-semifold.ly b/input/test/repeat-semifold.ly index 346c5c8a56..d05959555b 100644 --- a/input/test/repeat-semifold.ly +++ b/input/test/repeat-semifold.ly @@ -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 } }} diff --git a/lily/crescendo.cc b/lily/crescendo.cc index 2401502c9c..8257150872 100644 --- a/lily/crescendo.cc +++ b/lily/crescendo.cc @@ -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; diff --git a/lily/include/score-element.hh b/lily/include/score-element.hh index 723cf5a283..3494e6b11d 100644 --- a/lily/include/score-element.hh +++ b/lily/include/score-element.hh @@ -9,7 +9,6 @@ #include "parray.hh" #include "virtual-methods.hh" -#include "directed-graph.hh" #include "graphical-element.hh" #include "lily-guile.hh" diff --git a/lily/include/spanner.hh b/lily/include/spanner.hh index 828391d70b..9cca78c8c4 100644 --- a/lily/include/spanner.hh +++ b/lily/include/spanner.hh @@ -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 diff --git a/lily/multi-measure-rest.cc b/lily/multi-measure-rest.cc index 214aab5098..dc6d8d547a 100644 --- a/lily/multi-measure-rest.cc +++ b/lily/multi-measure-rest.cc @@ -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] ; } diff --git a/lily/note-heads-engraver.cc b/lily/note-heads-engraver.cc index c725690a4a..5243ff56cd 100644 --- a/lily/note-heads-engraver.cc +++ b/lily/note-heads-engraver.cc @@ -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()) diff --git a/lily/paper-stream.cc b/lily/paper-stream.cc index 0102377824..401b120842 100644 --- a/lily/paper-stream.cc +++ b/lily/paper-stream.cc @@ -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; } diff --git a/lily/repeated-music.cc b/lily/repeated-music.cc index 57b1b2bf88..3b6da8cf4e 100644 --- a/lily/repeated-music.cc +++ b/lily/repeated-music.cc @@ -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; diff --git a/lily/rest-engraver.cc b/lily/rest-engraver.cc index aef1e884bb..d3436d462b 100644 --- a/lily/rest-engraver.cc +++ b/lily/rest-engraver.cc @@ -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) diff --git a/lily/slur.cc b/lily/slur.cc index 2838bcce96..8585589bd9 100644 --- a/lily/slur.cc +++ b/lily/slur.cc @@ -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 diff --git a/lily/spacing-spanner.cc b/lily/spacing-spanner.cc index df73a595a4..64ebe46a6b 100644 --- a/lily/spacing-spanner.cc +++ b/lily/spacing-spanner.cc @@ -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) { /* diff --git a/lily/spanner.cc b/lily/spanner.cc index 843a020b36..ca2f5d5618 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -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 (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; +} diff --git a/lily/staff-side.cc b/lily/staff-side.cc index a74e1c8bf3..b0cefd1e1b 100644 --- a/lily/staff-side.cc +++ b/lily/staff-side.cc @@ -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 } diff --git a/lily/tie.cc b/lily/tie.cc index 7b682914c3..eeaf89fa98 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -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; diff --git a/lily/volta-spanner.cc b/lily/volta-spanner.cc index bcc2424106..a227d07d7c 100644 --- a/lily/volta-spanner.cc +++ b/lily/volta-spanner.cc @@ -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 diff --git a/make/mudela-rules.make b/make/mudela-rules.make index c2e1b202e5..b6c04a5e48 100644 --- a/make/mudela-rules.make +++ b/make/mudela-rules.make @@ -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 ../$< diff --git a/make/mudela-targets.make b/make/mudela-targets.make index 8b13789179..e032d7ee59 100644 --- a/make/mudela-targets.make +++ b/make/mudela-targets.make @@ -1 +1,2 @@ +# empty diff --git a/make/mudela-vars.make b/make/mudela-vars.make index 8b13789179..024d2ab564 100644 --- a/make/mudela-vars.make +++ b/make/mudela-vars.make @@ -1 +1,4 @@ +# empty +TELY_FILES := $(wildcard *.tely) +EXTRA_DIST_FILES += $(TELY_FILES) diff --git a/make/out/lilypond.lsm b/make/out/lilypond.lsm index 41b3a82f16..3e7c78c8ec 100644 --- a/make/out/lilypond.lsm +++ b/make/out/lilypond.lsm @@ -1,7 +1,7 @@ Begin3 Title: LilyPond -Version: 1.2.4 -Entered-date: 30AUG99 +Version: 1.2.5 +Entered-date: 02SEP99 Description: LilyPond is a music typesetter. It produces beautiful sheet music using a high level description file as input. LilyPond is part of @@ -12,8 +12,8 @@ Author: hanwen@cs.uu.nl (Han-Wen Nienhuys) janneke@gnu.org (Jan Nieuwenhuizen) Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys) Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert - 1000k lilypond-1.2.4.tar.gz + 1000k lilypond-1.2.5.tar.gz Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/ - 1000k lilypond-1.2.4.tar.gz + 1000k lilypond-1.2.5.tar.gz Copying-policy: GPL End diff --git a/make/out/lilypond.spec b/make/out/lilypond.spec index cd3d275e54..88f90ecdae 100644 --- a/make/out/lilypond.spec +++ b/make/out/lilypond.spec @@ -1,9 +1,9 @@ Name: lilypond -Version: 1.2.4 +Version: 1.2.5 Release: 1 Copyright: GPL Group: Applications/Publishing -Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.2.4.tar.gz +Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.2.5.tar.gz Summary: A program for printing sheet music. URL: http://www.cs.uu.nl/~hanwen/lilypond Packager: Han-Wen Nienhuys diff --git a/ps/lily.ps b/ps/lily.ps index f2d5c1a058..b25deb22b2 100644 --- a/ps/lily.ps +++ b/ps/lily.ps @@ -1,5 +1,5 @@ %!PS-Adobe-1.0: lily.ps - +% % 2 setlanguagelevel % hmm. auto_resize_dicts doesn't help either. % round cappings 1 setlinecap diff --git a/scm/lily.scm b/scm/lily.scm index ecfda6b42d..cba847f06b 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -233,9 +233,12 @@ (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 diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index 8021e51818..e679cae1d8 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -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) diff --git a/stepmake/aclocal.m4 b/stepmake/aclocal.m4 index 66401aa09a..c71271fe54 100644 --- a/stepmake/aclocal.m4 +++ b/stepmake/aclocal.m4 @@ -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 ]) diff --git a/stepmake/bin/add-html-footer.py b/stepmake/bin/add-html-footer.py index 9c4126e0a1..9ffa512c33 100644 --- a/stepmake/bin/add-html-footer.py +++ b/stepmake/bin/add-html-footer.py @@ -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 = '\n' + s s = check_tag ('', '', s, 1) - #urg - if regex.search ('@COUNTER_REF@', s) != -1: - counter = '' - try: - counter = os.environ[package.NAME + '_COUNTERPATH'] - counter = '
\n' - except: - pass - s = regsub.gsub ('@COUNTER_REF@', counter, s) - dump_file (f, s) diff --git a/stepmake/bin/ls-latex.py b/stepmake/bin/ls-latex.py index 92c0d1644a..98eb250d51 100644 --- a/stepmake/bin/ls-latex.py +++ b/stepmake/bin/ls-latex.py @@ -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 diff --git a/stepmake/bin/package-diff.py b/stepmake/bin/package-diff.py index 2645a6fd53..4919c80f03 100644 --- a/stepmake/bin/package-diff.py +++ b/stepmake/bin/package-diff.py @@ -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=']) diff --git a/stepmake/bin/packagepython.py b/stepmake/bin/packagepython.py index a1b8bab546..1950f56935 100755 --- a/stepmake/bin/packagepython.py +++ b/stepmake/bin/packagepython.py @@ -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 - - diff --git a/stepmake/bin/table-to-html.py b/stepmake/bin/table-to-html.py index 437116fbcc..6cfc2f1c2d 100644 --- a/stepmake/bin/table-to-html.py +++ b/stepmake/bin/table-to-html.py @@ -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 ('') + html.write ('
') def footer (html): - html.write ('
') - -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 = '' + join (columns, '') + '' - 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 ('') + +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 = '' + string.join (columns, '') + '' + 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/bin/texi2man.sh b/stepmake/bin/texi2man.sh deleted file mode 100644 index 58144a0c6a..0000000000 --- a/stepmake/bin/texi2man.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# texi2man.sh - -if [ $# -ne 2 ]; then - echo "Usage: texi2man TEXINFO-FILE MAN-FILENAME" - exit 2 -fi - -date=`date +%d/%b/%y` -#urg -package_name=LilyPond -#urg urg -version=0.1.71 - -infile=$1 -outfile=$2 -name=`basename $1 .texinfo` -name=`basename $name .texi` -name=`echo $name | tr '[A-Z]' '[a-z]'` -NAME=`echo $name | tr '[a-z]' '[A-Z]'` - -echo .TH\ $NAME\ 1\ \"$date\" "$package_name Documentation" >$outfile - -NEWLINE=" -" -cat $infile | -#urg, wish we could fix texi2roff :-( -sed 's!.*\\input .*texinfo.*!!' | -sed 's!^@chapter.*!@section NAME!' | -# sed 's!^@node *[Ii]nvoking.*!@section SYNOPSIS!' | -sed 's!^@node.*!!' | -# perl -pe "{s/\@node ([^,]*).*/\@section /;\$i=\$1; \$i=~tr [a-z] [A-Z]; chop; \$_.=\$i . \"\n\";}" | -perl -pe "{s/\@section (.*)/\@section /;\$i=\$1; \$i=~tr [a-z] [A-Z]; chop; \$_.=\$i . \"\n\";}" | -sed 's!^@subsection .*!!' | -sed 's!^@c *@texi2man@!@!' | -perl -pe "s/\@url{([^}]*)}/\$1/" | -perl -pe "s/\@email{([^},]*)}/<\$1>/" | -perl -pe "s/\@email{([^},]*),([^}]*)}/\$2, <\$1>/" | -sed "s!DESCRIPTION!& NEWLINE\ -This manual page was automatically generated from $infile by $0. For more details, please refer to the info pages: NEWLINE\ - info $name NEWLINE\ -!" | -sed "s!NEWLINE!\\$NEWLINE!g" | -# debugging: -tee $infile.texi2roff | -texi2roff -ms | -sed 's!^\.ds __ !.SH !' | -# /\&\n(H1.\n(H2 \*(__ -sed 's!.*(H1.*!!' | -cat >> $outfile - diff --git a/stepmake/stepmake/texinfo-rules.make b/stepmake/stepmake/texinfo-rules.make index 3177c3bd83..ce726fe8c1 100644 --- a/stepmake/stepmake/texinfo-rules.make +++ b/stepmake/stepmake/texinfo-rules.make @@ -1,35 +1,22 @@ # Texinfo_rules.make -.SUFFIXES: .1 .html .texinfo +.SUFFIXES: .html .texinfo -texi2man = $(step-bindir)/out/texi2man $< $@ -texi2html =\ - rm -f $@.urg;\ - cat $< | sed "s!@include.*!!" > $@.urg;\ - $(TEXI2HTML) $@.urg;\ - rm -f $@.urg;\ - mv $(@F).urg.html $@;\ - rm -f $(@F:%.html=%.html.urg_toc.html);\ - add-URLs $@ +$(outdir)/%.info: $(outdir)/%.texi + makeinfo --output=$@ $< -$(outdir)/%.1: %.texinfo - $(texi2man) +$(outdir)/%.html: $(outdir)/%.texi + -makeinfo --force --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)/%.info: $(outdir)/%.texinfo - $(MAKEINFO) --force -o $@ $< +$(outdir)/%.dvi: $(outdir)/%.texi +# --clean only in >= 3.12s +# cd $(outdir); texi2dvi --clean ../$< + cd $(outdir); texi2dvi ../$< -# $(outdir)/%.html: %.texinfo -# $(texi2html) -# add-html-footer --index $(depth)/../index.html $@ +$(outdir)/%.txt: $(outdir)/%.texi + $(MAKEINFO) --no-split --no-headers --output $@ $< -# texi2html is as broken as pod2html 5004 :-) -# we'll have to use pod2html 5003 for now. -# don't burn your .pod sources! -# -$(outdir)/%.html: $(outdir)/%.texinfo - $(texi2html) - $(PYTHON) $(step-bindir)/add-html-footer.py --package=$(topdir) --index $(depth)/../index.html $@ - -$(outdir)/%.1: $(outdir)/%.texinfo - -$(texi2man) +$(outdir)/%.texi: %.texi + cp $< $@ diff --git a/stepmake/stepmake/texinfo-targets.make b/stepmake/stepmake/texinfo-targets.make new file mode 100644 index 0000000000..1bb8bf6d7f --- /dev/null +++ b/stepmake/stepmake/texinfo-targets.make @@ -0,0 +1 @@ +# empty diff --git a/stepmake/stepmake/texinfo-vars.make b/stepmake/stepmake/texinfo-vars.make new file mode 100644 index 0000000000..3a7e7ae04c --- /dev/null +++ b/stepmake/stepmake/texinfo-vars.make @@ -0,0 +1,4 @@ + +TEXI_FILES = $(wildcard *.texi) + +EXTRA_DIST_FILES += $(TEXI_FILES) diff --git a/tex/lily-ps-defs.tex b/tex/lily-ps-defs.tex index cb353c583b..da9907c536 100644 --- a/tex/lily-ps-defs.tex +++ b/tex/lily-ps-defs.tex @@ -15,37 +15,6 @@ % 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 - \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